找到满足方程 1/x + 1/y = 1/n 且 x、y 和 n 为整数的不同对 {x, y}

  • 本文关键字:整数 方程 满足 algorithm math
  • 更新时间 :
  • 英文 :


任务是找到符合方程 1/x + 1/y = 1/n 的不同 {x, y} 对的数量,其中 n 是用户给出的输入。x 和 y 的不同顺序不算作新对。

例如,值n = 2表示1/n = 1/21/2可以用两对 {x, y} 形成,它们是6 and 34 and 4

n = 3的值将表示1/n = 1/31/3可以用两对 {x, y} 形成,它们是4 and 126 and 6

1/x + 1/y = 1/n的数学方程可以转换为y = nx/(x-n)如果所述转换方程中的yx是完整的,则它们计为一对{x,y}。使用上述转换后的公式,我将从x = n + 1开始迭代n次,每次迭代将x加 1 次,以查找是否nx % (x - n) == 0;如果它产生 true,则xy是一个新的非重复对。

我找到了答案,通过手动计算答案并找到重复次数"模式",将我的迭代限制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

最新更新