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 = 0d = m a = n b = -m c = 1hb = d; kb = 1if hb * hb - n * kb * kb == 1:return hbwhile True: nc = a - b * b nc /= c nd = int((math.sqrt(a) - b) / nc) nb = -b - nd * ncc = nc; d = nd; b = nb;hc = d * hb + hakc = d * kb + kaha = hbka = kbhb = hckb = kcif hc * hc - n * kc * kc == 1:return hcreturn 0
ans = 0
tmp = 0
for i in range(1, 1001):z = gao(i)if z > tmp:tmp = zans = i
print ans