我正在寻找一种在 PARI/GP 计算器 (gp) 中将十进制值转换为分数的自动化方法。比如我想把0.759765625变成389/512。我知道我可以通过输入“759765625/10^9”手动执行此操作,但我想要一种更简单的方法,例如“合理化(0.759765625);” 将在千里马工作。
如果它不能直接做到这一点,也许有一个计算小数位数的功能?然后我可以将该函数的结果提高 10。(该函数必须计算 0 的前导小数位才有用。)
我正在寻找一种在 PARI/GP 计算器 (gp) 中将十进制值转换为分数的自动化方法。比如我想把0.759765625变成389/512。我知道我可以通过输入“759765625/10^9”手动执行此操作,但我想要一种更简单的方法,例如“合理化(0.759765625);” 将在千里马工作。
如果它不能直接做到这一点,也许有一个计算小数位数的功能?然后我可以将该函数的结果提高 10。(该函数必须计算 0 的前导小数位才有用。)
使用 bestappr() 函数;对于给出的示例,使用 bestappr(0.759765625,10^9)。(回答由 PARI/GP 邮件列表提供。)
这仍然有必须手动指定小数位数的缺点,但这可以克服:bestappr() 的第二个参数可以是 10 的非常大的幂,大于您将需要的最长小数“合理化”。
注意:确保在调用 bestappr 之前使用 \p 命令将精度设置得足够高。
在 pari-2.5 中,您可以直接使用 bestappr(x),而无需指定额外的位数参数。它将使用所有内部可用的数字:
? bestappr(Pi)
%1 = 17004845848539028973023/5412810546621363616752
两种很好的方法:
一)使用lindep
:
x=Pi;digits=7;l=lindep([x,1],digits);-l[2]/l[1]
b) 通过在遇到大的部分商时停止来使用连分数(下面,我将限制固定为 1000):
x=Pi;maxquot=1000;p0=0;p1=1;q0=1;q1=0;a=floor(x);while(a<maxquot,p2=a*p1+p0;q2=a*q1+q0;p0=p1;p1=p2;q0=q1;q1=q2;x=1/frac(x);a=floor(x));p1/q1