mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
big: Fix M-R.
This commit is contained in:
@@ -93,45 +93,16 @@ demo :: proc() {
|
|||||||
err: Error;
|
err: Error;
|
||||||
prime: bool;
|
prime: bool;
|
||||||
|
|
||||||
foo := [4]f64{1, 2, 4, 5};
|
trials := 1;
|
||||||
fmt.println(foo.rrr);
|
|
||||||
|
|
||||||
trials := 15;
|
set(c, "3317044064679887385961981");
|
||||||
|
|
||||||
{
|
{
|
||||||
SCOPED_TIMING(.is_prime);
|
SCOPED_TIMING(.is_prime);
|
||||||
for p in _private_prime_table[2:] {
|
prime, err = internal_int_is_prime(c, trials);
|
||||||
|
|
||||||
set(a, p);
|
|
||||||
prime, err = internal_int_is_prime(a, trials);
|
|
||||||
if !prime || err != nil {
|
|
||||||
fmt.printf("%v wrongly flagged as composite\n", p);
|
|
||||||
}
|
|
||||||
|
|
||||||
set(a, p - 1);
|
|
||||||
prime, err = internal_int_is_prime(a, trials);
|
|
||||||
if prime || err != nil {
|
|
||||||
fmt.printf("%v wrongly flagged as prime\n", p);
|
|
||||||
}
|
|
||||||
|
|
||||||
set(a, p + 1);
|
|
||||||
prime, err = internal_int_is_prime(a, trials);
|
|
||||||
if prime || err != nil {
|
|
||||||
fmt.printf("%v wrongly flagged as prime\n", p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Timings[.is_prime].count = len(_private_prime_table[2:]) * 3;
|
|
||||||
|
|
||||||
internal_set(a, "3317044064679887385961981");
|
|
||||||
|
|
||||||
{
|
|
||||||
SCOPED_TIMING(.is_prime);
|
|
||||||
prime, err = internal_int_is_prime(a, trials);
|
|
||||||
if prime || err != nil {
|
|
||||||
print("Wrongly flagged as prime: ", a);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
//print("prime: ", c);
|
||||||
|
fmt.printf("%v %v\n", prime, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ internal_int_prime_miller_rabin :: proc(a, b: ^Int, allocator := context.allocat
|
|||||||
/*
|
/*
|
||||||
Ensure `b` > 1.
|
Ensure `b` > 1.
|
||||||
*/
|
*/
|
||||||
if internal_gt(b, 1) { return false, nil; }
|
if internal_lte(b, 1) { return false, nil; }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get `n1` = `a` - 1.
|
Get `n1` = `a` - 1.
|
||||||
@@ -291,10 +291,10 @@ internal_int_prime_miller_rabin :: proc(a, b: ^Int, allocator := context.allocat
|
|||||||
`a` is the big Int to test for primality.
|
`a` is the big Int to test for primality.
|
||||||
|
|
||||||
`miller_rabin_trials` can be one of the following:
|
`miller_rabin_trials` can be one of the following:
|
||||||
< 0: For `a` up to 3_317_044_064_679_887_385_961_981, set `miller_rabin_trials` to negative to run a predetermined
|
`< 0`: For `a` up to 3_317_044_064_679_887_385_961_981, set `miller_rabin_trials` to negative to run a predetermined
|
||||||
number of trials for a deterministic answer.
|
number of trials for a deterministic answer.
|
||||||
= 0: Run Miller-Rabin with bases 2, 3 and one random base < `a`. Non-deterministic.
|
`= 0`: Run Miller-Rabin with bases 2, 3 and one random base < `a`. Non-deterministic.
|
||||||
> 0: Run Miller-Rabin with bases 2, 3 and `miller_rabin_trials` number of random bases. Non-deterministic.
|
`> 0`: Run Miller-Rabin with bases 2, 3 and `miller_rabin_trials` number of random bases. Non-deterministic.
|
||||||
|
|
||||||
`miller_rabin_only`:
|
`miller_rabin_only`:
|
||||||
`false` Also use either Frobenius-Underwood or Lucas-Selfridge, depending on the compile-time `MATH_BIG_USE_FROBENIUS_TEST` choice.
|
`false` Also use either Frobenius-Underwood or Lucas-Selfridge, depending on the compile-time `MATH_BIG_USE_FROBENIUS_TEST` choice.
|
||||||
|
|||||||
Reference in New Issue
Block a user