pell方程及连分数
wiki如下
http://zh.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B8
http://zh.wikipedia.org/zh-cn/%E4%BD%A9%E5%B0%94%E6%96%B9%E7%A8%8B
主要应用的是
对于连分数 ,前四个收敛(编号 到 )是
用普通语言来说,第 3 个收敛的分子是借由第 3 个商()乘上第 2 个收敛的分子,并加上第 1 个收敛的分子而成。分母的形成也很类似。
如果找到连续的收敛,带有分子 和分母 ,则相关的递归关系是:
连续的收敛由如下公式给出
如果 a0, a1, a2, ... 是正整数的无限序列,递归的定义序列 和 :
设 是的连分数表示:的渐近分数列,由连分数理论知存在 使得(pi,qi) 为佩尔方程的解。取其中最小的 ,将对应的 (pi,qi) 称为佩尔方程的基本解,或最小解,记作(x1,y1)
例如:
首先根据根号7的渐进连分数表示,找出前几项,察看(分子,分母)是否是一组解。
- 第一项: , 不是解;
- 第二项: , 不是解;
- 第三项: , 不是解;
- 第四项: , 是解。
于是最小解是(8,3)。计算的各次乘方,或者用递推公式(不能直接得出某一项)就可以得到接下来的各组解
- (8,3)、 (127,48)、 (2024,765)、 (32257,12192)、 (514088,194307)、 (8193151;3096720)、 (130576328,49353213) ......
然后我就可以用python写代码咯
import math
def gao(n):
m = int(math.sqrt(n))
if m * m == n:
return 0
ha = 1; ka = 0
d = m
a = n
b = -m
c = 1
hb = d; kb = 1
if hb * hb - n * kb * kb == 1:
return hb
while True:
nc = a - b * b
nc /= c
nd = int((math.sqrt(a) - b) / nc)
nb = -b - nd * nc
c = nc; d = nd; b = nb;
hc = d * hb + ha
kc = d * kb + ka
ha = hb
ka = kb
hb = hc
kb = kc
if hc * hc - n * kc * kc == 1:
return hc
return 0
ans = 0
tmp = 0
for i in range(1, 1001):
z = gao(i)
if z > tmp:
tmp = z
ans = i
print ans