nicoo
86a4749e3a
factor::numeric: fix original "Generalise modular inverse computation"
2020-07-24 11:28:12 -05:00
nicoo
6e228d3184
Merge branches 'factor/faster/{centralise_logic, montgomery32}'
2020-07-05 00:20:16 +02:00
nicoo
4cfe754551
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:08:49 +02:00
nicoo
9b0f131135
Fix bug in factor::factor::factor (>_>")
...
Non-prime numbers, such as 0 or 1, shouldn't be inserted in the factorisation.
2020-07-05 00:07:38 +02:00
nicoo
e9e263ac66
factor::Factors: Derive Clone and Debug
...
Useful for printing out in-progress factorisations when debugging.
2020-07-05 00:07:33 +02:00
nicoo
7bdc81b882
factor: Add a first property-based test
2020-07-05 00:07:16 +02:00
nicoo
dcc22188ba
factor: Fix clippy warnings
2020-07-05 00:05:45 +02:00
nicoo
f1d1cb80e4
factor::Factors: Generalise invariant check (from prime() to add())
2020-07-05 00:05:45 +02:00
nicoo
2d2b6faab4
factor: Avoid moving data around in main factoring loop
...
Instead, the same `Factors` object is passed around through the execution.
~10% faster.
2020-07-05 00:05:45 +02:00
nicoo
6713d2ad62
factor: Move recursive factoring logic from rho to factor
...
No functional change, but prepares a coming optimisation.
2020-07-05 00:05:45 +02:00
nicoo
bd4d6fcac5
factor: Split the CLI and I/O code off the factoring logic
2020-07-05 00:05:45 +02:00
nicoo
6256750376
factor::miller_rabin: Use a macro to instantiate every test
2020-07-05 00:04:56 +02:00
nicoo
7a1b86c9c2
factor::numeric::tests: Use a macro to instantiate every test
2020-07-05 00:04:53 +02:00
nicoo
cbcc760f83
factor::miller_rabin: Squash another bug! >:3
...
Detected by the testsuite improvement just prior.
2020-07-05 00:04:49 +02:00
nicoo
3d6fdffe14
factor::miller_rabin: Generalise tests to 32 and 64b Montgomery
2020-07-05 00:04:29 +02:00
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