Есть ли способ рационализировать десятичное число в пари / GP? - PullRequest
1 голос
/ 04 июня 2009

Я ищу автоматический способ преобразования десятичного значения в дробь в калькуляторе PARI / GP (gp). Например, я хочу превратить 0,759765625 в 389/512. Я знаю, что могу сделать это вручную, набрав «759765625/10 ^ 9», но я бы хотел более простой способ, например «рационализировать (0.759765625);» будет работать в Максима.

Если он не может сделать это напрямую, может быть, есть функция для подсчета количества десятичных разрядов? Тогда я мог бы поднять 10 до результата этой функции. (Функция должна считать начальные десятичные разряды 0, чтобы быть полезной.)

Ответы [ 3 ]

3 голосов
/ 05 апреля 2013

В pari-2.5 вы можете использовать bestappr (x) напрямую, без указания дополнительных аргумент числа цифр. Он будет использовать все доступные внутри цифры:

? bestappr(Pi)
%1 = 17004845848539028973023/5412810546621363616752
3 голосов
/ 05 июня 2009

Используйте функцию bestappr (); для данного примера используйте bestappr (0,759765625,10 ^ 9). (Ответ любезно предоставлен списком рассылки PARI / GP.)

Это все еще имеет тот недостаток, что число десятичных цифр нужно указывать вручную, но это можно преодолеть: второй параметр для bestappr () может быть сделан очень большой степенью 10, больше, чем самый длинный десятичный знак, который вы когда-либо надо "рационализировать".

Внимание: убедитесь, что вы установили достаточно высокую точность перед вызовом bestappr, используя команду \ p.

0 голосов
/ 08 ноября 2015

Два отличных способа сделать это:

а) использовать 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
...