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