我最近对 Project Euler 非常上瘾,接下来我正在尝试做这个!我已经开始对其进行一些分析,并且已经大大减少了问题。这是我的工作:
A = pqr 和
1/A = 1/p + 1/q + 1/r 所以 pqr/A = pq + pr + qr
由于第一个方程:
pq+pr+qr = 1
由于 p、q 和 r 中的两个必须是负数,我们可以将方程简化为:
abc 其中 ab = ac+bc+1
求解 c 我们得到:
ab-1 = (a+b)c
c = (ab-1)/(a+b)
这意味着我们需要找到 a 和 b :
ab = 1 (mod a+b)
然后我们的 A 值与那些 a 和 b 是:
A = abc = ab(ab-1)/(a+b)
对不起,如果这是很多数学!但现在我们要处理的只是一个条件和两个方程。现在,因为我需要找到写为 ab(ab-1)/(a+b) 且 ab = 1 (mod a+b) 的第 150,000 个最小整数,所以理想情况下我想搜索 A 的 (a, b)尽可能小。
为方便起见,我假设 a < b 并且我还注意到 gcd(a, b) = 1。
我的第一个实现是直截了当的,甚至可以足够快地找到 150,000 个解决方案。但是,找到 150,000 个最小的解决方案需要很长时间。无论如何,这是代码:
n = 150000
seen = set()
a = 3
while len(seen) < n:
for b in range(2, a):
if (a*b)%(a+b) != 1: continue
seen.add(a*b*(a*b-1)//(a+b))
print(len(seen), (a, b), a*b*(a*b-1)//(a+b))
a += 1
我的下一个想法是使用 Stern-Brocot 树,但这太慢了,无法找到解决方案。我的最终算法是使用中国剩余定理来检查 a+b 的不同值是否产生解决方案。该代码很复杂,虽然速度更快,但还不够快......
所以我完全没有想法!有人有什么想法吗?