bigtest.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <lib9.h>
  2. #include <mp.h>
  3. #include <libsec.h>
  4. char *sfactors[] =
  5. { "3", "5", "17", "257", "641", "65537", "274177", "2424833", "6700417", "45592577",
  6. "6487031809", "67280421310721", "1238926361552897", "59649589127497217",
  7. "5704689200685129054721", "4659775785220018543264560743076778192897",
  8. "7455602825647884208337395736200454918783366342657",
  9. "93461639715357977769163558199606896584051237541638188580280321",
  10. "741640062627530801524787141901937474059940781097519023905821316144415759504705008092818711693940737",
  11. "130439874405488189727484768796509903946608530841611892186895295776832416251471863574140227977573104895898783928842923844831149032913798729088601617946094119449010595906710130531906171018354491609619193912488538116080712299672322806217820753127014424577"
  12. };
  13. long start;
  14. void
  15. printmp(mpint *b, char *tag)
  16. {
  17. int n;
  18. char *p;
  19. print("%s (%d) ", tag, b->top);
  20. p = mptoa(b, 10, nil, 0);
  21. write(1, p, strlen(p));
  22. free(p);
  23. print("\n");
  24. }
  25. int
  26. timing(void)
  27. {
  28. long now, span;
  29. now = time(0);
  30. span = now-start;
  31. start = now;
  32. return span;
  33. }
  34. int expdebug;
  35. void
  36. main(int argc, char **argv)
  37. {
  38. mpint *p, *k, *d, *b, *e, *x, *r;
  39. int i;
  40. start = time(0);
  41. fmtinstall('B', mpconv);
  42. mpsetminbits(2*Dbits);
  43. x = mpnew(0);
  44. e = mpnew(0);
  45. r = mpnew(0);
  46. p = mpnew(0);
  47. // b = 2^32
  48. b = mpcopy(mpone);
  49. mpleft(b, 32, b);
  50. // 2^29440
  51. p = mpcopy(mpone);
  52. mpleft(p, 29440, p);
  53. // 2^27392
  54. k = mpcopy(mpone);
  55. mpleft(k, 27392, k);
  56. // k = 2^29440 - 2^27392
  57. mpsub(p, k, k);
  58. // p = 2^29440 - 2^27392 + 1
  59. mpadd(k, mpone, p);
  60. // if(!probably_prime(p, 18)){
  61. // print("not a prime\n");
  62. // exits(0);
  63. // }
  64. // print("probably prime\n");
  65. mpright(k, 10, k);
  66. printmp(k, "k =");
  67. expdebug = 1;
  68. mpexp(b, k, p, x);
  69. printmp(x, "x =");
  70. print("timing %d\n", timing());
  71. for(i = 0; i < nelem(sfactors); i++){
  72. d = strtomp(sfactors[i], nil, 10, nil);
  73. // e = k/d
  74. mpdiv(k, d, e, r);
  75. printmp(r, "r =");
  76. // x = b^e mod p
  77. mpexp(b, e, p, x);
  78. printmp(x, "x =");
  79. print("timing %d\n", timing());
  80. }
  81. }