📄 reuse.c
字号:
if (ds_funcs[i] == 0) continue; if (strcmp (ds_func_names[i], "mpz_sqrt") == 0 && mpz_sgn (in1) < 0) continue; (ds_funcs[i]) (ref1, in1); mpz_set (res1, in1); (ds_funcs[i]) (res1, res1); if (mpz_cmp (ref1, res1) != 0) FAIL (ds, i, in1, in2, NULL); } in2i = mpz_get_ui (in2); for (i = 0; i < sizeof (dsi_funcs) / sizeof (dsi_func); i++) { if (dsi_funcs[i] == 0) continue; if (strcmp (dsi_func_names[i], "mpz_fdiv_q_2exp") == 0) /* Limit exponent to something reasonable for the division functions. Without this, we'd normally shift things off the end and just generate the trivial values 1, 0, -1. */ in2i %= 0x1000; if (strcmp (dsi_func_names[i], "mpz_mul_2exp") == 0) /* Limit exponent more for mpz_mul_2exp to save time. */ in2i %= 0x100; if (strcmp (dsi_func_names[i], "mpz_pow_ui") == 0) /* Limit exponent yet more for mpz_pow_ui to save time. */ in2i %= 0x10; (dsi_funcs[i]) (ref1, in1, in2i); mpz_set (res1, in1); (dsi_funcs[i]) (res1, res1, in2i); if (mpz_cmp (ref1, res1) != 0) FAIL (dsi, i, in1, in2, NULL); } if (in2i != 0) /* Don't divide by 0. */ { for (i = 0; i < sizeof (dsi_div_funcs) / sizeof (dsi_div_funcs); i++) { r1 = (dsi_div_funcs[i]) (ref1, in1, in2i); mpz_set (res1, in1); r2 = (dsi_div_funcs[i]) (res1, res1, in2i); if (mpz_cmp (ref1, res1) != 0 || r1 != r2) FAIL (dsi_div, i, in1, in2, NULL); } for (i = 0; i < sizeof (ddsi_div_funcs) / sizeof (ddsi_div_funcs); i++) { r1 = (ddsi_div_funcs[i]) (ref1, ref2, in1, in2i); mpz_set (res1, in1); r2 = (ddsi_div_funcs[i]) (res1, res2, res1, in2i); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || r1 != r2) FAIL (ddsi_div, i, in1, in2, NULL); mpz_set (res2, in1); (ddsi_div_funcs[i]) (res1, res2, res2, in2i); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || r1 != r2) FAIL (ddsi_div, i, in1, in2, NULL); } } if (mpz_sgn (in1) >= 0) { mpz_sqrtrem (ref1, ref2, in1); mpz_set (res1, in1); mpz_sqrtrem (res1, res2, res1); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0) FAIL2 (mpz_sqrtrem, in1, NULL, NULL); mpz_set (res2, in1); mpz_sqrtrem (res1, res2, res2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0) FAIL2 (mpz_sqrtrem, in1, NULL, NULL); } if (mpz_sgn (in1) >= 0) { mpz_root (ref1, in1, in2i % 0x100 + 1); mpz_set (res1, in1); mpz_root (res1, res1, in2i % 0x100 + 1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_root, in1, in2, NULL); } if (pass < reps / 2) /* run fewer tests since gcdext lots of time */ { mpz_gcdext (ref1, ref2, ref3, in1, in2); mpz_set (res1, in1); mpz_gcdext (res1, res2, res3, res1, in2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res2, in1); mpz_gcdext (res1, res2, res3, res2, in2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res3, in1); mpz_gcdext (res1, res2, res3, res3, in2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res1, in2); mpz_gcdext (res1, res2, res3, in1, res1); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res2, in2); mpz_gcdext (res1, res2, res3, in1, res2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res3, in2); mpz_gcdext (res1, res2, res3, in1, res3); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res1, in1); mpz_gcdext (res1, res2, NULL, res1, in2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res2, in1); mpz_gcdext (res1, res2, NULL, res2, in2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res1, in2); mpz_gcdext (res1, res2, NULL, in1, res1); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); mpz_set (res2, in2); mpz_gcdext (res1, res2, NULL, in1, res2); if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || mpz_cmp (ref3, res3) != 0) FAIL2 (mpz_gcdext, in1, in2, NULL); } /* Don't run mpz_powm for huge exponents or when undefined. */ if (mpz_sizeinbase (in2, 2) < 250 && mpz_sgn (in3) != 0 && (mpz_sgn (in2) >= 0 || mpz_invert (t, in1, in3))) { mpz_powm (ref1, in1, in2, in3); mpz_set (res1, in1); mpz_powm (res1, res1, in2, in3); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_powm, in1, in2, in3); mpz_set (res1, in2); mpz_powm (res1, in1, res1, in3); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_powm, in1, in2, in3); mpz_set (res1, in3); mpz_powm (res1, in1, in2, res1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_powm, in1, in2, in3); } /* Don't run mpz_powm_ui when undefined. */ if (mpz_sgn (in3) != 0) { mpz_powm_ui (ref1, in1, in2i, in3); mpz_set (res1, in1); mpz_powm_ui (res1, res1, in2i, in3); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_powm_ui, in1, in2, in3); mpz_set (res1, in3); mpz_powm_ui (res1, in1, in2i, res1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_powm_ui, in1, in2, in3); } { r1 = mpz_gcd_ui (ref1, in1, in2i); mpz_set (res1, in1); r2 = mpz_gcd_ui (res1, res1, in2i); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_gcd_ui, in1, in2, NULL); } if (mpz_cmp_ui (in2, 1L) > 0 && mpz_sgn (in1) != 0) { /* Test mpz_remove */ mpz_remove (ref1, in1, in2); mpz_set (res1, in1); mpz_remove (res1, res1, in2); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_remove, in1, in2, NULL); mpz_set (res1, in2); mpz_remove (res1, in1, res1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_remove, in1, in2, NULL); } if (mpz_sgn (in2) != 0) { /* Test mpz_divexact */ mpz_mul (t, in1, in2); mpz_divexact (ref1, t, in2); mpz_set (res1, t); mpz_divexact (res1, res1, in2); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_divexact, t, in2, NULL); mpz_set (res1, in2); mpz_divexact (res1, t, res1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_divexact, t, in2, NULL); } if (mpz_sgn (in2) > 0) { /* Test mpz_divexact_gcd, same as mpz_divexact */ mpz_mul (t, in1, in2); mpz_divexact_gcd (ref1, t, in2); mpz_set (res1, t); mpz_divexact_gcd (res1, res1, in2); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_divexact_gcd, t, in2, NULL); mpz_set (res1, in2); mpz_divexact_gcd (res1, t, res1); if (mpz_cmp (ref1, res1) != 0) FAIL2 (mpz_divexact_gcd, t, in2, NULL); } } if (failures != 0) { fprintf (stderr, "mpz/reuse: %ld error%s\n", failures, "s" + (failures == 1)); exit (1); } mpz_clear (bs); mpz_clear (in1); mpz_clear (in2); mpz_clear (in3); mpz_clear (ref1); mpz_clear (ref2); mpz_clear (ref3); mpz_clear (res1); mpz_clear (res2); mpz_clear (res3); mpz_clear (t); tests_end (); exit (0);}voiddump (char *name, mpz_t in1, mpz_t in2, mpz_t in3){ printf ("failure in %s (", name); mpz_out_str (stdout, -16, in1); if (in2 != NULL) { printf (" "); mpz_out_str (stdout, -16, in2); } if (in3 != NULL) { printf (" "); mpz_out_str (stdout, -16, in3); } printf (")\n");}#endif /* ! DLL_EXPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -