0180 有理零点
* * * *
拉格朗日计划
* * * *
有理零点

对于给定的任意整数n,考虑这样三个函数。 \begin{align*} f_{1,n}(x,y,z)&=x^{n+1}+y^{n+1}-z^{n+1}, \\ f_{2,n}(x,y,z)&=(xy+yz+zx)(x^{n-1}+y^{n-1}-z^{n-1}), \\ f_{3,n}(x,y,z)&=xyz(x^{n-2}+y^{n-2}-z^{n-2}), \\ \end{align*} 以及它们的组合 $$f_n(x,y,z)=f_{1,n}(x,y,z)+f_{2,n}(x,y,z)-f_{3,n}(x,y,z),$$ 若x,y,z都可以表示为有理数$a/b$的形式,其中$0< a < b\le k$,a,b,k都是自然数,且至少存在一个整数n,使得$f_n(x,y,z=0)$,那么就称$(x,y,z)$为k阶黄金三元组。

记$s(x,y,z)=x+y+z$,考虑所有35阶黄金三元组所对应的$s(x,y,z)$,记其中所有不同取值之和为$t=u/v$,此处$s(x,y,z)$和t都应写作最简分式的形式。

求$u+v$。

本题难度:



解答

容易验证 $$f_n(x,y,z)=(x+y+z)(x^n+y^n-z^n),$$ 因此本题转化为求$x^n+y^n=z^n$的有理解。

若$n=0$则显然有$x^0+y^0=2\neq 1=z^0$。否则可记 $$x=\frac{a_1}{b_1}, \quad y=\frac{a_2}{b_2}, \quad z=\frac{a_3}{b_3}$$ 其中$0 < a_i < b_i\le 35$是自然数。

若$n>0$,则原方程可以写作 $$(a_1b_2b_3)^n+(a_2b_1b_3)^n=(a_3b_1b_2)^n.$$ 由费马大定理可知上式在$n\ge 3$时无解。

同理若$n < 0$,则原方程可以写作 $$(b_1a_2a_3)^{|n|}+(b_2a_1a_3)^{|n|}=(b_3a_1a_2)^{|n|},$$ 在$|n|\ge 3$时也无解。

因此接下来的策略很明确,枚举$x,y,z$并只需要考虑$n=-2,-1,1,2$的情况。

由于$35^6$仍较大,因此先生成所有满足要求的分数$a/b$,再用字典记录$b/a, a^2/b^2, b^2/a^2$所对应的$a/b$,最后从分数列表中枚举$x,y$并检查$x+y,x^2+y^2,x^{-1}+y^{-1}, x^{-2}+y^{-1}$是否在字典中以得z,并根据$x+y+z$的值去重。

结果是$285196020571078987$。

from functools import *
import math,fractions

f=dict([[fractions.Fraction(a,b),fractions.Fraction(b,a)] for a in range(1,35) for b in range (a+1,36)])
f0=dict([[t*t,t] for t in f])
f1=dict([[f[t],t] for t in f])
f2=dict([[f[t]*f[t],t] for t in f])

@cache
def check(x,y):
    r=[x+y] if x+y in f else []
    r+=[f0.get(x*x+y*y,0),f1.get(f[x]+f[y],0),f2.get(f[x]*f[x]+f[y]*f[y],0)]
    return [t for t in r if t>0]
        
s=sum(set([x+y+z for x in f for y in f for z in check(x,y)]))

print(s.numerator+s.denominator)