对小学生来说有点弱智,对大学生来说则刚刚好
不妨先假定a和b是定值,再求解。
a / b - x / y = (a - x) / (b - y) = (a * y - b * x) / (b * y)
(a - x) * b * y = (a * y - b * x) * (b - y)
a * y ^ 2 - 2 * b * x * y + x * b ^ 2 = 0
# 这里可以看成一个以y为未知数的一元二次方程
y = (2 * b * x ± sqrt(4 * b ^ 2 * (x ^ 2 - a * x))) / (2 * a)于是可以写一段脚本求解。
from math import sqrt, fabs, gcd
def jdg(a, b, x, y):
res1 = a / b - x / y
res2 = (a - x) / (b - y)
assert fabs(res1 - res2) < 1e-10
if fabs(y - round(y)) < 1e-10:
y = round(y)
assert y % b == 0
print(a, b, x, y, '%.5f %.5f' % (res1, res2), y // b, gcd(x, y) == 1)
if __name__ == '__main__':
N = 20 + 1
for a in range(1, N):
for b in range(a + 1, N):
if gcd(a, b) > 1:
continue
for x in range(a, N):
delta = 2 * b * sqrt(x ** 2 - a * x)
y1 = (2 * b * x + delta) / (2 * a)
y2 = (2 * b * x - delta) / (2 * a)
if b != y1:
jdg(a, b, x, y1)
if x > a and b != y2:
jdg(a, b, x, y2)
# 结论:解得的所有的y都是b的倍数。比如15 19 20 38 0.26316 0.26316 False附上自动format命令
autopep8 --in-place --aggressive --aggressive . --recursive那个性质作为课后习题。我已经找到了一个绝妙的证明方法,但这里太窄了写不下(不会写求佬们教教QAQ)。