1、首先学习一下连分数。
连分数:维基百科。
连分数表示的算法会学习一下。
考虑实数 r。设 i 是 r 的整数部分,而 f 是它的小数部分。则 r 的连分数表示是 [i; …],这里的“…”是 1/f 的连分数表示。习惯上用分号取代第一个逗号。
要计算实数 r 的连分数表示,写下 r 的整数部分(技术上 floor)。从 r 减去这个整数部分。如果差为 0 则停止;否则找到这个差的倒数并重复。这个过程将终止,当且仅当 r 是有理数。
找出 3.245 的连分数 | ||||
---|---|---|---|---|
停止 | ||||
3.245 的连分数是 [3; 4, 12, 4] | ||||
数 3.245 还可以表示为连分数展开 [3; 4, 12, 3, 1];参见下面的有限连分数。
这个算法适合于实数,但如果用浮点数实现的话,可能导致数值灾难。作为替代,任何浮点数是一个精确的有理数(在现代计算机上分母通常是 2 的幂,在电子计算器上通常是 10 的幂),所以欧几里得GCD算法的变体可以用来给出精确的结果。
2.PELL方程的解法。
若一个丢番图方程具有以下的形式:
且为正整数,则称此方程为佩尔方程(英文:Pell's equation 德文:Pellsche Gleichung)
若是完全平方数,则这个方程式只有解(实际上对任意的,都是解)。对于其余情况,拉格朗日证明了佩尔方程总有解。而这些解可由的连分数求出。
设 是的连分数表示:的渐近分数列,由连分数理论知存在 使得(pi,qi) 为佩尔方程的解。取其中最小的 ,将对应的 (pi,qi) 称为佩尔方程的基本解,或最小解,记作(x1,y1) ,则所有的解(xi,yi) 可表示成如下形式:
或者由以下递推公式得到: