⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.c

📁 tommath库
💻 C
📖 第 1 页 / 共 2 页
字号:
       mp_copy(&b, &c);      rr = 0;      do {         if (!(rr & 127)) { printf("%9lu\r", rr); fflush(stdout); }         mp_sqr(&b, &b); mp_add_d(&b, 1, &b);         mp_copy(&b, &c);         mp_mod(&b, &a, &b);         mp_dr_reduce(&c, &a, (((mp_digit)1)<<DIGIT_BIT)-a.dp[0]);         if (mp_cmp(&b, &c) != MP_EQ) {            printf("Failed on trial %lu\n", rr); exit(-1);         }      } while (++rr < 500);      printf("Passed DR test for %d digits\n", cnt);   }#endif   div2_n = mul2_n = inv_n = expt_n = lcm_n = gcd_n = add_n =   sub_n = mul_n = div_n = sqr_n = mul2d_n = div2d_n = cnt = add_d_n = sub_d_n= 0;   /* force KARA and TOOM to enable despite cutoffs */   KARATSUBA_SQR_CUTOFF = KARATSUBA_MUL_CUTOFF = 110;   TOOM_SQR_CUTOFF      = TOOM_MUL_CUTOFF      = 150;   for (;;) {       /* randomly clear and re-init one variable, this has the affect of triming the alloc space */       switch (abs(rand()) % 7) {           case 0:  mp_clear(&a); mp_init(&a); break;           case 1:  mp_clear(&b); mp_init(&b); break;           case 2:  mp_clear(&c); mp_init(&c); break;           case 3:  mp_clear(&d); mp_init(&d); break;           case 4:  mp_clear(&e); mp_init(&e); break;           case 5:  mp_clear(&f); mp_init(&f); break;           case 6:  break; /* don't clear any */       }       printf("%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu ", add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, expt_n, inv_n, div2_n, mul2_n, add_d_n, sub_d_n);       fgets(cmd, 4095, stdin);       cmd[strlen(cmd)-1] = 0;       printf("%s  ]\r",cmd); fflush(stdout);       if (!strcmp(cmd, "mul2d")) { ++mul2d_n;          fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin); sscanf(buf, "%d", &rr);          fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 64);          mp_mul_2d(&a, rr, &a);          a.sign = b.sign;          if (mp_cmp(&a, &b) != MP_EQ) {             printf("mul2d failed, rr == %d\n",rr);             draw(&a);             draw(&b);             return 0;          }       } else if (!strcmp(cmd, "div2d")) { ++div2d_n;          fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin); sscanf(buf, "%d", &rr);          fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 64);          mp_div_2d(&a, rr, &a, &e);          a.sign = b.sign;          if (a.used == b.used && a.used == 0) { a.sign = b.sign = MP_ZPOS; }          if (mp_cmp(&a, &b) != MP_EQ) {             printf("div2d failed, rr == %d\n",rr);             draw(&a);             draw(&b);             return 0;          }       } else if (!strcmp(cmd, "add")) { ++add_n;          fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);          mp_copy(&a, &d);          mp_add(&d, &b, &d);          if (mp_cmp(&c, &d) != MP_EQ) {             printf("add %lu failure!\n", add_n);draw(&a);draw(&b);draw(&c);draw(&d);             return 0;          }          /* test the sign/unsigned storage functions */          rr = mp_signed_bin_size(&c);          mp_to_signed_bin(&c, (unsigned char *)cmd);          memset(cmd+rr, rand()&255, sizeof(cmd)-rr);          mp_read_signed_bin(&d, (unsigned char *)cmd, rr);          if (mp_cmp(&c, &d) != MP_EQ) {             printf("mp_signed_bin failure!\n");             draw(&c);             draw(&d);             return 0;          }          rr = mp_unsigned_bin_size(&c);          mp_to_unsigned_bin(&c, (unsigned char *)cmd);          memset(cmd+rr, rand()&255, sizeof(cmd)-rr);          mp_read_unsigned_bin(&d, (unsigned char *)cmd, rr);          if (mp_cmp_mag(&c, &d) != MP_EQ) {             printf("mp_unsigned_bin failure!\n");             draw(&c);             draw(&d);             return 0;          }       } else if (!strcmp(cmd, "sub")) { ++sub_n;          fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);          mp_copy(&a, &d);          mp_sub(&d, &b, &d);          if (mp_cmp(&c, &d) != MP_EQ) {             printf("sub %lu failure!\n", sub_n);draw(&a);draw(&b);draw(&c);draw(&d);             return 0;          }       } else if (!strcmp(cmd, "mul")) { ++mul_n;          fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);          mp_copy(&a, &d);          mp_mul(&d, &b, &d);          if (mp_cmp(&c, &d) != MP_EQ) {             printf("mul %lu failure!\n", mul_n);draw(&a);draw(&b);draw(&c);draw(&d);             return 0;          }       } else if (!strcmp(cmd, "div")) { ++div_n;          fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 64);          fgets(buf, 4095, stdin); mp_read_radix(&c, buf, 64);          fgets(buf, 4095, stdin); mp_read_radix(&d, buf, 64);          mp_div(&a, &b, &e, &f);          if (mp_cmp(&c, &e) != MP_EQ || mp_cmp(&d, &f) != MP_EQ) {             printf("div %lu %d, %d, failure!\n", div_n, mp_cmp(&c, &e), mp_cmp(&d, &f));draw(&a);draw(&b);draw(&c);draw(&d); draw(&e); draw(&f);             return 0;          }       } else if (!strcmp(cmd, "sqr")) { ++sqr_n;          fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);          mp_copy(&a, &c);          mp_sqr(&c, &c);          if (mp_cmp(&b, &c) != MP_EQ) {             printf("sqr %lu failure!\n", sqr_n);draw(&a);draw(&b);draw(&c);             return 0;          }       } else if (!strcmp(cmd, "gcd")) { ++gcd_n;          fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);          fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);          mp_copy(&a, &d);          mp_gcd(&d, &b, &d);          d.sign = c.sign;          if (mp_cmp(&c, &d) != MP_EQ) {             printf("gcd %lu failure!\n", gcd_n);draw(&a);draw(&b);draw(&c);draw(&d);             return 0;          }       } else if (!strcmp(cmd, "lcm")) { ++lcm_n;             fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);             mp_copy(&a, &d);             mp_lcm(&d, &b, &d);             d.sign = c.sign;             if (mp_cmp(&c, &d) != MP_EQ) {                printf("lcm %lu failure!\n", lcm_n);   draw(&a);draw(&b);draw(&c);draw(&d);                return 0;             }       } else if (!strcmp(cmd, "expt")) {  ++expt_n;             fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&d, buf, 64);             mp_copy(&a, &e);             mp_exptmod(&e, &b, &c, &e);             if (mp_cmp(&d, &e) != MP_EQ) {                printf("expt %lu failure!\n", expt_n);   draw(&a);draw(&b);draw(&c);draw(&d); draw(&e);                return 0;             }       } else if (!strcmp(cmd, "invmod")) {  ++inv_n;             fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&c, buf, 64);             mp_invmod(&a, &b, &d);             mp_mulmod(&d,&a,&b,&e);             if (mp_cmp_d(&e, 1) != MP_EQ) {                printf("inv [wrong value from MPI?!] failure\n");                draw(&a);draw(&b);draw(&c);draw(&d);                mp_gcd(&a, &b, &e);                draw(&e);                return 0;             }       } else if (!strcmp(cmd, "div2")) { ++div2_n;             fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);             mp_div_2(&a, &c);             if (mp_cmp(&c, &b) != MP_EQ) {                 printf("div_2 %lu failure\n", div2_n);                 draw(&a);                 draw(&b);                 draw(&c);                 return 0;             }       } else if (!strcmp(cmd, "mul2")) { ++mul2_n;             fgets(buf, 4095, stdin);  mp_read_radix(&a, buf, 64);             fgets(buf, 4095, stdin);  mp_read_radix(&b, buf, 64);             mp_mul_2(&a, &c);             if (mp_cmp(&c, &b) != MP_EQ) {                 printf("mul_2 %lu failure\n", mul2_n);                 draw(&a);                 draw(&b);                 draw(&c);                 return 0;             }       } else if (!strcmp(cmd, "add_d")) { ++add_d_n;              fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 64);              fgets(buf, 4095, stdin); sscanf(buf, "%d", &ix);              fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 64);              mp_add_d(&a, ix, &c);              if (mp_cmp(&b, &c) != MP_EQ) {                 printf("add_d %lu failure\n", add_d_n);                 draw(&a);                 draw(&b);                 draw(&c);                 printf("d == %d\n", ix);                 return 0;              }       } else if (!strcmp(cmd, "sub_d")) { ++sub_d_n;              fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 64);              fgets(buf, 4095, stdin); sscanf(buf, "%d", &ix);              fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 64);              mp_sub_d(&a, ix, &c);              if (mp_cmp(&b, &c) != MP_EQ) {                 printf("sub_d %lu failure\n", sub_d_n);                 draw(&a);                 draw(&b);                 draw(&c);                 printf("d == %d\n", ix);                 return 0;              }       }   }   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -