Есть ли способ рационализировать десятичную дробь в Pari / GP?
-
09-09-2019 - |
Вопрос
Я ищу автоматический способ превратить десятичное значение в дробь в калькуляторе PARI / GP (gp).Например, я хочу превратить 0,759765625 в 389/512.Я знаю, что могу сделать это вручную, введя '759765625/10 ^ 9', но я бы хотел более простой способ, например 'rationalize (0.759765625);', который работал бы в Maxima.
Если он не может сделать это напрямую, может быть, есть функция для подсчета количества знаков после запятой?Тогда я мог бы увеличить 10 до результата этой функции.(Функция должна была бы подсчитывать начальные десятичные разряды 0, чтобы быть полезной.)
Решение
В pari-2.5 вы можете использовать bestappr(x) напрямую, без указания дополнительного аргумента количество цифр.Он будет использовать все внутренне доступные цифры:
? bestappr(Pi)
%1 = 17004845848539028973023/5412810546621363616752
Другие советы
Используйте функцию bestappr();для приведенного примера используйте bestappr(0.759765625,10^9).(Ответ любезно предоставлен списком рассылки PARI / GP.)
Это все еще имеет тот недостаток, что количество десятичных разрядов должно быть задано вручную, но это можно преодолеть:второму параметру bestappr() можно присвоить очень большую степень 10, большую, чем самая длинная десятичная дробь, которая вам когда-либо понадобится для "рационализации".
Осторожно:убедитесь, что установлена достаточно высокая точность, прежде чем вызывать bestappr, используя команду \p.
Два отличных способа сделать это:
а) использовать lindep
:
x=Pi;digits=7;l=lindep([x,1],digits);-l[2]/l[1]
б) используйте непрерывные дроби, останавливаясь всякий раз, когда встречается большое частное (ниже я установил ограничение на 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