nicoo
9b149a759b
factor::miller_rabin: Hoist edge-cases (even, <2) out of test()
...
test() takes a modulus that is known to not be even or <2 (otherwise the
Montgomery value could not be constructed), so those checks can be hoisted
into is_prime() and out of the critical path.
2020-07-05 00:04:26 +02:00
nicoo
4f08e28167
factor::miller_rabin: Add property-based test
2020-07-05 00:04:08 +02:00
nicoo
d2fa0fe63c
factor::miller_rabin::tests: small_composites → small_semiprimes
...
This is more descriptive, as semiprime are the products of 2 primes;
all semiprimes are composite, but not all composite numbers are semiprime.
2020-07-05 00:01:48 +02:00
nicoo
1e4d824829
factor::miller_rabin: Add negative test over all small composites
2020-07-05 00:01:44 +02:00
nicoo
600268c6e4
factor::miller_rabin::tests: Refactor
2020-07-05 00:01:40 +02:00
nicoo
0a1200bdb8
factor::miller_rabin: Add test for the largest 64b composite numbers
2020-07-05 00:01:37 +02:00
nicoo
308290325a
factor::miller_rabin::is_prime: Fix bug
...
Montgomery<_> only works for odd n, so attempting to construct an instance
for an even number results in a panic!
The most obvious solution is to special-case even numbers.
2020-07-05 00:01:33 +02:00
nicoo
d2b43f49f9
factor::numeric::OverflowingAdd: Generate impls with a macro
2020-07-05 00:01:21 +02:00
nicoo
b25c77c5f9
factor::numeric: Generate implementations of DoubleInt with a macro
2020-07-05 00:01:21 +02:00
nicoo
f95f977f98
factor::numeric: Generate implementations of Int with a macro
2020-07-05 00:01:21 +02:00
nicoo
53954badd7
factor::numeric: Refactor away the use of {To,From}Primitives
2020-07-05 00:01:21 +02:00
nicoo
19a8231fb2
factor::numeric::Arithmetic: Rename associated type I to ModInt
2020-07-05 00:01:21 +02:00
nicoo
caa79a1261
factor::numeric: Split Int and DoubleInt traits
2020-07-05 00:01:21 +02:00
nicoo
28244413d1
factor::numeric: Document when to remove OverflowingAdd trait
2020-07-05 00:01:21 +02:00
nicoo
3f79be0219
factor::numeric: Use debug_assert! for runtime assertions.
2020-07-05 00:01:21 +02:00
nicoo
774feb0a40
factor::numeric: Generalise tests for Arithmetic trait
2020-07-05 00:01:21 +02:00
Alex Lyon
4d28f48ad9
factor: combine Montgomery and Montgomery32
2020-07-05 00:01:21 +02:00
nicoo
a440807e6c
factor::miller_rabin: Use a specialized basis for 32b integers
...
~3% faster
2020-07-05 00:01:21 +02:00
nicoo
e68bb192f2
factor::numeric: Add a 32b Montgomery variant [WiP]
...
~32% faster
2020-07-05 00:01:21 +02:00
nicoo
43ee92c40f
factor::numeric: Generalise modular inverse computation
2020-07-05 00:01:21 +02:00
Alex Lyon
bb01e67521
Merge pull request #1560 from shlomif/fix-grammar
...
[README] Correct some broken grammar & spelling.
2020-07-01 10:57:15 -07:00
Shlomi Fish
3f928a7612
[README] Revise some suboptimal phrasing.
...
Also incorporated the change commentary by @Arcterus. ( Thanks! ).
2020-06-29 22:45:30 +03:00
Alex Lyon
9de82d92b0
Merge pull request #1557 from nbraud/factor/issue_1556
...
factor::miller_rabin: Fix bug #1556
2020-06-24 04:53:32 -07:00
Alex Lyon
700d51a92b
Merge pull request #1528 from sylvestre/cp-no-deref
...
feature(cp) implement -P/--no-deference
2020-06-23 23:05:26 -07:00
nicoo
abf579975c
factor::miller_rabin: Fix bug in primality test
...
Introduced in 6b9585b1
(#1525 : Performance improvements for `factor`).
Closes #1556
2020-06-23 16:19:16 +02:00
nicoo
c5c86b00e9
factor::miller_rabin: Add tests reproducing #1556
2020-06-23 16:14:52 +02:00
Sylvestre Ledru
c7c2ae54b8
Merge pull request #1553 from rivy/fix.tests-factor
...
tests/factor ~ re-enable factor tests
2020-06-21 20:39:56 +02:00
Roy Ivy III
f3ee45171f
tests/factor ~ re-enable factor tests (with additional detail for failures)
...
- probably fixes #1531 (via #1529 ) per @nbraud
2020-06-21 12:17:46 -05:00
Alex Lyon
ddd38403e6
Merge pull request #1552 from nbraud/factor/faster/table
...
Speed up factor::table
2020-06-20 13:55:14 -07:00
nicoo
8e040bbf1a
factor::table: Optimise the size of the precomputed table
...
A too-large precomputed table actually slows down the program: we spend
time fetching it from disk and from memory (into the CPU's cache), and
larger prime factors are more unlikely to occur in random integers (prime p
occurs with probability ~1/p when sampling 64b numbers uniformly-at-random)
The new value was chosen after measuring the execution time (for all
integers between 2 and 10⁷) for a broad set of values:
| n | time (s) |
|------|----------|
| 16 | 40.84 |
| 32 | 34.491 |
| 64 | 29.044 |
| 128 | 25.121 |
| 192 | 23.98 |
| 256 | 23.102 |
| 256 | 24.93 |
| 272 | 23.57 |
| 288 | 23.85 |
| 304 | 23.91 |
| 320 | 23.24 |
| 329 | 23.45 |
| 336 | 23.55 |
| 352 | 23.09 |
| 368 | 23.65 |
| 384 | 23.32 |
| 384 | 23.36 |
| 400 | 23.30 |
| 416 | 23.38 |
| 432 | 23.42 |
| 448 | 23.95 |
| 448 | 24.00 |
| 464 | 23.81 |
| 480 | 23.55 |
| 496 | 24.10 |
| 512 | 24.101 |
| 512 | 24.23 |
| 1027 | 29.864 |
2020-06-20 22:22:55 +02:00
nicoo
9d992b77b2
factor: Keep the primes table size in a single place
2020-06-20 22:22:55 +02:00
nicoo
b956e632e1
factor::table: Coalesce accesses to the factors
table
...
~5.6% faster
2020-06-20 22:22:55 +02:00
Alex Lyon
c97c98bd2b
Merge pull request #1550 from nbraud/factor/rhofactor
...
factor::rho: Refactor for readability and fewer allocations
2020-06-20 06:17:33 -07:00
Sylvestre Ledru
2d62097843
feature(cp): Manage -P & -R
2020-06-20 10:49:15 +02:00
nicoo
0518e06053
factor::rho: Minor refactor for readability
2020-06-20 10:39:56 +02:00
nicoo
dacee413db
factor::rho: Refactor to avoid unnecessary allocations
2020-06-20 10:39:56 +02:00
nicoo
71e1c52920
factor::Factors: Rename new() to one()
2020-06-20 10:39:56 +02:00
Sylvestre Ledru
280fafed8a
feature(cp) implement -P/--no-deference
2020-06-20 09:38:39 +02:00
Alex Lyon
f33ffc73eb
Merge pull request #1549 from nbraud/factor/strong-pseudoprime-bug
...
factor: Fix very-rare bug in ρ
2020-06-19 16:46:59 -07:00
nicoo
45a1408fb0
fixup! factor: Add test exhibiting a bug in ρ
2020-06-19 15:28:01 +02:00
nicoo
9fe3de72f2
factor::rho: Fix very-unlikely bug (resulting in assertion failure)
...
This bug can only be triggered when:
- the Miller-Rabin test produces a divisor `d` (rare) ;
- n / d is prime.
2020-06-19 13:51:29 +02:00
nicoo
9eb944b6b9
factor: Add test exhibiting a bug in ρ
...
The test is repeated 20 times to make it overwhelmingly-likely to fail
(the bug itself is only triggered rarely)
2020-06-19 13:48:00 +02:00
nicoo
3a90e31307
factor::numeric::inv_mod_u64: Provide a more-helpful error message
2020-06-19 13:39:42 +02:00
Alex Lyon
02b419db5f
Merge pull request #1545 from sylvestre/vscode
...
vscode: install rust support & rla
2020-06-18 23:50:41 -07:00
Alex Lyon
486022307c
Merge pull request #1547 from nbraud/factor/faster/display
...
factors: Speed up displaying the results
2020-06-18 23:36:04 -07:00
nicoo
ef12991ee7
factors: Avoid repeatedly locking and flushing stdout
...
By default, stdout's LineWriter results one syscall per line, i.e. a billion
syscalls when factoring a billion numbers...
Buffering the output yields a ~28% speedup.
2020-06-18 16:45:40 -07:00
nicoo
2869248318
factor::Factors: Use a tree-based map internally
...
This eliminate the need for sorting the prime factors for display.
25% performance improvement after the changes from factor/montgomery.
2020-06-18 16:44:08 -07:00
nicoo
4b4d11b61a
factor: Add/update copyright notices as necessary ( #1546 )
2020-06-18 21:38:28 +02:00
Alex Lyon
6105cce69a
Merge pull request #1529 from nbraud/factor/montgomery
...
factor: Faster modular arithmetic with the Montgomery transform
2020-06-18 09:19:12 -07:00
nicoo
fb08d9ff9e
factor::numeric::Montgomery::add: Deal with rare overflow case
2020-06-18 14:32:58 +02:00