110 Diophantine Reciprocals
正整数方程 如果 ,那么有 113 个不同的解,这是不同解的数量超过 100 的最小的 值。
求不同解的数量超过四百万的 的最小值。
和 必须大于 ,否则 或 就比 大了。所以不妨令 ,其中 也都是整数。带入原式,我们可以得到 。所以原方程就变成了 有多少种方式分解成两数之积。
可以写作 可以写作 因数的个数是,那么解的个数就是因数个数加一除以二。
我们可以找到一个数,满足题意,但不一定最小。
假设 取值都是1,那么前十五个质数 乘积组成的 就有超过四百万个解,因为 。
能不能让这个数再小一点呢?
去掉尾部的一个质数,因数会小三倍,那么前面某个质数对应的 从1 到 4,那么指数从 3 到 9,刚好弥补三倍,2 的三次方是 8,3 的三次方是 27,比 43 和 47 小,所以可以去掉,然后 和 升到4。
上面我们推测的数对应的因子比四百万大很多,能不能去掉 41 呢?5 和 7 对应的 从 1 到 2,那么指数涨了 5/3 倍,两个数就是 25/9 倍,再除以三,是 25/27 倍,得到的因数还是远远大于四百万的。
综上,我们只需要前十二个质数即可。对应的 的取值分别是 。这些值的上限是多少呢?
17 对应的 值上限就是 1。如果是2 ,那么相比 1,因数个数增长了 5/3 倍,那么 2 从 4 到 6,3 从 4 到 5,增长 143/81,比 5/3 要大,但是其乘积是 12,比 17 小。17 之后的也上限也只能是1。
其他数字的上限怎么确定呢?我们用 5 做例子。假设对应的 最大是 5,那么考虑把它减到 2,因数少了 11/5 倍,我们增加一个质数比如 41,能增加三倍的因数,同时 41 比 125 小很多。所以 5 太宽松了,最大值取 4 即可。
经过一系列的分析,可以得出对应的最大值分别是 。
下面是代码,从取值为 0 开始,一直循环到最大值,然后看因数个数是否大于四百万,然后在所有满足题意的数字中选择最小的。
private readonly int MAX = 4_000_000;
private readonly int[] Primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
private readonly int[] MaxPower = [9, 5, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1];
private BigInteger min = long.MaxValue;
private void Check(int[] power, int index)
{
if (index == power.Length)
{
int count = 1;
foreach (var item in power)
{
count *= (1 + item * 2);
}
count++;
count /= 2;
if (count > MAX)
{
var n = Primes.Zip(power, (i, j) => (long)Math.Pow(i, j))
.Select(l => (BigInteger)l).Aggregate(BigInteger.Multiply);
if (n < min)
{
min = n;
}
}
}
else
{
for (int i = 0; i <= MaxPower[index]; i++)
{
var copy = power.ToArray();
copy[index] = i;
Check(copy, index + 1);
}
}
}