任务是找到符合方程 1/x + 1/y = 1/n 的不同 {x, y} 对的数量,其中 n 是用户给出的输入。x 和 y 的不同顺序不算作新对。
例如,值n = 2
表示1/n = 1/2
。1/2
可以用两对 {x, y} 形成,它们是6 and 3
和4 and 4
。
n = 3
的值将表示1/n = 1/3
。1/3
可以用两对 {x, y} 形成,它们是4 and 12
和6 and 6
。
1/x + 1/y = 1/n
的数学方程可以转换为y = nx/(x-n)
如果所述转换方程中的y
和x
是完整的,则它们计为一对{x,y}。使用上述转换后的公式,我将从x = n + 1
开始迭代n
次,每次迭代将x
加 1 次,以查找是否nx % (x - n) == 0
;如果它产生 true,则x
和y
是一个新的非重复对。
我找到了答案,通过手动计算答案并找到重复次数"模式",将我的迭代限制n
次。x
也以n+1
开头,因为否则会发生除以零或y
将导致负数。模运算符表示获得的 y 是完整的。
问题:
- 为什么迭代限制在
n
次背后是否有数学解释?通过手动计算和查找模式,我发现迭代的限制是n
次:我只需要迭代n
次即可找到不同对的数量。 - 除了我上面的方法之外,还有没有另一种方法可以找到不同对 {x, y} 的数量,即通过查找不同对本身的 VALUES 然后对不同对的数量求和?有没有我不知道的快速数学公式?
作为参考,我的代码可以在这里看到:https://gist.github.com/TakeNoteIAmHere/596eaa2ccf5815fe9bbc20172dce7a63
假设 x,y,n> 0
我们有观察 1:x 和 y 都必须大于 n
观察2:由于(x,y)和(y,x)不算不同,我们可以假设x<= y。
观察3:x = y = 2n总是一个解,如果x>2n,则y<x(因此没有新的解)>
这意味着 x 的可能值从 n+1 到 2n。
一点代数就可以反转方程
1/x + 1/y = n
到
(x-n)*(y-n) = n*n
由于我们想要整数解,我们寻找整数 f、g 以便
f*g = n*n
然后 x 和 y 的解决方案是
x = f+n, y = g+n
我认为最简单的方法是分解n,即写
n = (P[1]^k[1]) * .. *(P[m]^k[m])
其中 Ps 是不同的素数,ks 正整数和 ^ 表示幂。
那么 f 和 g 的可能性是
f = P[1]^a[1]) * .. *(P[m]^a[m])
g = P[1]^b[1]) * .. *(P[m]^b[m])
其中 as 和 bs 满足,对于每个 i=1..m
0<=a[i]<=2*k[i]
b[i] = 2*k[i] - a[i]
如果我们只想计算解的数量,我们只需要计算 fs 的数量,即不同序列 a[] 的数量。但这只是
Nall = (2*k[1]+1)*... (2*[k[m]+1)
但是,我们希望将解决方案(f,g)和(g,f)视为相同。只有一种情况 f = g(因为素数的因式分解是唯一的,如果 a[] 等于 b[],我们只能有 f=g),所以我们寻找的数字是
1 + (Nall-1)/2