Всех приветствую.
При написании программы по
алгоритму Andrey A столкнулся с необходимостью раскладывать некое вещественное число (точнее квадратный корень из него если это чем-то поможет) в цепную дробь, а также получать из неё
подходящие (
вики называет их так) дроби в виде
. Порыскав по документации к PARI/GP нашёл функции
contfrac для первого и
contfracpnqn для второго. Засада с ними в том что они требуют точного указания числа членов разложения, а мне в программе было бы удобнее (и быстрее!) раскладывать итерационно, получая член за членом и останавливаясь когда станет достаточно (пока не знаю как это заранее оценить). Делать разложение руками невыгодно, слишком медленно (на порядок).
Потому вопрос номер раз: нет ли готовой встроенной функции для разложения числа в цепную дробь рекурентно/итерационно? Возможно я что-то не нашёл или не понял в доке.
Вопрос номер два: а как попроще получить (понятно что примерно) исходное вещественное число из заданной цепной дроби? Руками собирать обратно это извращение, пока могу лишь натравить на неё
contfracpnqn и взять любое приближение. Нет ли способа проще и быстрее?
Вопрос номер три:
Код:
? \p
realprecision = 28 significant digits
? contfrac(sqrt(176),2)
%1 = [13, 3]
? contfrac(sqrt(176),3)
%2 = [13, 4]
? contfrac(sqrt(176),4)
%3 = [13, 3, 1, 3]
? contfrac(sqrt(176),5)
%4 = [13, 3, 1, 3, 26]
? contfrac(sqrt(176),6)
%5 = [13, 3, 1, 3, 26, 3]
Почему вместо трёх элементов функция вернула лишь два?! Нет, понятно, что-то там с округлением, но почему не вернула
, оно же равно
? Это просто мрак!