2kprime.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* Makes safe primes of a 2k nature */
  2. #include <tommath.h>
  3. #include <time.h>
  4. int sizes[] = {256, 512, 768, 1024, 1536, 2048, 3072, 4096};
  5. int main(void)
  6. {
  7. char buf[2000];
  8. int x, y;
  9. mp_int q, p;
  10. FILE *out;
  11. clock_t t1;
  12. mp_digit z;
  13. mp_init_multi(&q, &p, NULL);
  14. out = fopen("2kprime.1", "w");
  15. for (x = 0; x < (int)(sizeof(sizes) / sizeof(sizes[0])); x++) {
  16. top:
  17. mp_2expt(&q, sizes[x]);
  18. mp_add_d(&q, 3, &q);
  19. z = -3;
  20. t1 = clock();
  21. for(;;) {
  22. mp_sub_d(&q, 4, &q);
  23. z += 4;
  24. if (z > MP_MASK) {
  25. printf("No primes of size %d found\n", sizes[x]);
  26. break;
  27. }
  28. if (clock() - t1 > CLOCKS_PER_SEC) {
  29. printf("."); fflush(stdout);
  30. // sleep((clock() - t1 + CLOCKS_PER_SEC/2)/CLOCKS_PER_SEC);
  31. t1 = clock();
  32. }
  33. /* quick test on q */
  34. mp_prime_is_prime(&q, 1, &y);
  35. if (y == 0) {
  36. continue;
  37. }
  38. /* find (q-1)/2 */
  39. mp_sub_d(&q, 1, &p);
  40. mp_div_2(&p, &p);
  41. mp_prime_is_prime(&p, 3, &y);
  42. if (y == 0) {
  43. continue;
  44. }
  45. /* test on q */
  46. mp_prime_is_prime(&q, 3, &y);
  47. if (y == 0) {
  48. continue;
  49. }
  50. break;
  51. }
  52. if (y == 0) {
  53. ++sizes[x];
  54. goto top;
  55. }
  56. mp_toradix(&q, buf, 10);
  57. printf("\n\n%d-bits (k = %lu) = %s\n", sizes[x], z, buf);
  58. fprintf(out, "%d-bits (k = %lu) = %s\n", sizes[x], z, buf); fflush(out);
  59. }
  60. return 0;
  61. }
  62. /* $Source: /cvs/libtom/libtommath/etc/2kprime.c,v $ */
  63. /* $Revision: 1.2 $ */
  64. /* $Date: 2005/05/05 14:38:47 $ */