不是完整的答案,而是一些提示:
n的最大整数因子是n/2
所以不需要检查所有小于n的因子
可以使用质因数分解
最大的质因子是sqrt(n),所以不需要测试到n,而是测试到sqrt(n)或者测试到具有n位一半的数字
m=(2^(ceil(ceil(log2(n))/2)+1))-1
这应该会加速一些事情,但您需要添加非质数因子的计算
这看起来像某种系列(质因数分解)
divisors | prime_divisors | non_prime_divisors | LCM(all divisors)
1 | 1 | | 1
2 | 1,2 | | 2
3 | 1,2 | 4 | 4
4 | 1,2,3 | 6 | 6
5 | 1,2 | 4,8,16 | 16
6 | 1,2,3 | 4,6,12 | 12
7 | 1,2 | 4,8,16,32,64 | 64
8 | 1,2,3 | 4,6,8,12,24 | 24
...
16 | 1,2,3,5 |4,6,8,10,12,15,20,24,30,40,60,120 | 120
因此,尝试找到生成此顺序的方程式,然后在模算术中简单计算第n个迭代(简单的PI操作... modmul)。我可以看到偶数和奇数元素有不同的方程...
[编辑1] 分解到16个因子
1: 1
2: 1, 2
3: 1, 2, 4
4: 1, 2, 3, 6
5: 1, 2, 4, 8, 16
6: 1, 2, 3, 4, 6, 12
7: 1, 2, 4, 8, 16, 32, 64
8: 1, 2, 3, 4, 6, 8, 12, 24
9: 1, 2, 3, 4, 6, 9, 12, 18, 36
10: 1, 2, 3, 4, 6, 8, 12, 16, 24, 48
11: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,1024
12: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60
13: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,1024,2048,4096
14: 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 192
15: 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 36, 48, 72, 144
16: 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60, 120
d0<d1
,n=LCM(all divisors)
的值不仅仅是增加的...例如,对于d=5
的约数,最小的n=16
,而对于d=6
的约数,最小的n=12
!!! - Spektre