docs: explain HCN search algorithm
Add a concise README that documents how the program finds highly composite numbers. The explanation covers the divisor-count formula, why exponent order lets the search skip arbitrary numbers, and how the implementation generates and filters record candidates. Test Plan: - Not run; documentation-only change. Refs: N/A
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# hcn
|
||||
|
||||
Find highly composite numbers up to a search limit.
|
||||
|
||||
```bash
|
||||
cargo run --release -- 1000000000
|
||||
```
|
||||
|
||||
If no limit is given, the default is `1_000_000_000`.
|
||||
|
||||
## Algorithm
|
||||
|
||||
A number with prime factorization
|
||||
|
||||
```text
|
||||
n = 2^a * 3^b * 5^c * ...
|
||||
```
|
||||
|
||||
has
|
||||
|
||||
```text
|
||||
(a + 1) * (b + 1) * (c + 1) * ...
|
||||
```
|
||||
|
||||
divisors.
|
||||
|
||||
The exact primes do not affect the divisor count; only the exponents do.
|
||||
For a fixed exponent list, the smallest possible number is made by putting the
|
||||
largest exponent on the smallest prime:
|
||||
|
||||
```text
|
||||
a >= b >= c >= ...
|
||||
```
|
||||
|
||||
If a larger exponent appears on a larger prime, swapping those two exponents
|
||||
keeps the divisor count unchanged but makes the number smaller.
|
||||
|
||||
So a highly composite number cannot have that shape. If it did, the smaller
|
||||
swapped number would already have the same number of divisors, so the original
|
||||
number would not be the first record.
|
||||
|
||||
That means record candidates are only numbers like:
|
||||
|
||||
```text
|
||||
2^a * 3^b * 5^c * ... where a >= b >= c >= ...
|
||||
```
|
||||
|
||||
All other numbers are redundant for finding new records.
|
||||
|
||||
The program:
|
||||
|
||||
1. Recursively generates numbers from the first primes.
|
||||
2. Only tries exponent sequences where each exponent is no larger than the
|
||||
previous one.
|
||||
3. Stops a branch as soon as the number exceeds the search limit.
|
||||
4. Computes the divisor count directly from the exponents.
|
||||
5. Sorts candidates by number and prints each new divisor-count record.
|
||||
|
||||
This avoids factoring every number in the range.
|
||||
Reference in New Issue
Block a user