Вы можете попробовать использовать сопоставление:
a/b -> (a+2b)/(a+b)
, начиная с a= 1, b= 1
.Это сходится к sqrt (2) (фактически дает его непрерывные дробные представления).
Теперь ключевой момент: это можно представить в виде умножения матриц (аналогично Фибоначчи)
Еслиa_n и b_n - это n-е числа в шагах, тогда
[1 2] [a_n b_n] T = [a_ (n + 1) b_ (n + 1)] T [1 1]
, который теперь дает нам
[1 2] n [a_1 b_1] T = [a_ (n + 1)B_ (п + 1)] T [1 1]
Таким образом, если матрица 2x2 равна A, нам нужно вычислить A n , что можно сделать путем многократного возведения в квадрат и использовать только целочисленную арифметику (поэтому вам не нужнобеспокоиться о проблемах точности).
Также обратите внимание, что a / b, который вы получите, всегда будет в уменьшенной форме (как gcd (a, b) = gcd (a + 2b, a + b)), так что есливы думаете об использовании класса дроби для представления промежуточных результатов, не надо!
Поскольку n-й знаменатель подобен (1 + sqrt (2)) ^ n, для получения 3 миллионов цифр вам, скорее всего, понадобитсявычислять до 3671656 th term.
Примечание. Даже если вы ищете ~ 3,6-миллионный термин, повторное возведение в квадрат позволит вам вычислить n-й член в O (Log n)умножения и сложения.
Кроме того, это легко сделать параллельным, в отличие от итеративных, таких как Ньютон-Рафсон и т. д.