bench.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include <gmp.h>
  2. #include <iostream>
  3. using namespace std;
  4. typedef unsigned long long int u64;
  5. static const bool primality_pretest(u64 k) {
  6. if (!(k%3) || !(k%5) || !(k%7) || !(k%11) || !(k%13) || !(k%17) || !(k%19) || !(k%23)) {
  7. return (k <= 23);
  8. }
  9. return true;
  10. }
  11. static const bool probprime(u64 k, mpz_t n) {
  12. mpz_set_ui(n, k);
  13. return mpz_probab_prime_p(n, 0);
  14. }
  15. static const bool is_chernick( int n, u64 m, mpz_t z) {
  16. u64 t = (9 * m);
  17. for (int i = 2; i <= n-2; i++) {
  18. if (!primality_pretest((t << i) + 1)) {
  19. return false;
  20. }
  21. }
  22. if (!probprime(6 * m + 1, z)) {
  23. return false;
  24. }
  25. if (!probprime(12 * m + 1, z)) {
  26. return false;
  27. }
  28. if (!probprime(18*m + 1, z)) {
  29. return false;
  30. }
  31. for (int i = 2; i <= n-2; i++) {
  32. if (!probprime((t << i) + 1, z)) {
  33. return false;
  34. }
  35. }
  36. return true;
  37. }
  38. int main() {
  39. mpz_t z;
  40. mpz_inits(z, NULL);
  41. // k = 24237176657 (for n = 12)
  42. // when done, check the range from k = 38637176656 to 40237176657 (checked)
  43. // m = 31023586121600 (for n = 11)
  44. // m = 3208386195840 (for n = 10)
  45. //~ Tested up to k = 25000000000
  46. //~ Tested up to k = 26000000000
  47. //~ Tested up to k = 27000000000
  48. // ....
  49. //~ Tested up to k = 91000000000
  50. cout << is_chernick(10, 3208386195840LL, z) << endl;
  51. cout << is_chernick(11, 31023586121600LL, z) << endl;
  52. cout << "\n";
  53. cout << is_chernick(11, 3208386195840LL, z) << endl;
  54. cout << is_chernick(12, 31023586121600LL, z) << endl;
  55. cout << "\n";
  56. u64 from = 48474353315;
  57. int n = 11;
  58. int t = n-4;
  59. // Make sure we don't overflow
  60. cout << "Test: " << (from * 5 * (1<<(n-4)) * 9 * (1 << (n-2)) + 1) << endl;
  61. cout << "Test: " << (((((from * 5LL) << t) * 9) << (n-2)) + 1) << endl;
  62. // Make sure mpz works
  63. mpz_set_ui(z, (((((from * 5LL) << t) * 9) << (n-2)) + 1));
  64. cout << "Tmpz: " << mpz_get_ui(z) << endl;
  65. cout << "\n";
  66. u64 multiplier = 5*(1 << t);
  67. //~ for (u64 k = from; ; k++) {
  68. for (u64 k = from - 100000000; k <= 48474353315; k++) {
  69. if (k % 500000000LL == 0LL) {
  70. cout << "Tested up to k = " << k << endl;
  71. }
  72. u64 m = k * multiplier;
  73. if (primality_pretest(6*m + 1) && primality_pretest(12*m+1) && primality_pretest(18*m+1) && is_chernick(n, m, z)) {
  74. //~ if (m%5 != 0) {
  75. //~ cout << "Counter-example: " << m << endl;
  76. //~ break;
  77. //~ }
  78. //else {
  79. cout << "k = " << k << " and m = " << m << endl;
  80. break;
  81. // }
  82. //break;
  83. }
  84. }
  85. return 0;
  86. }