Это не работает. Вы не можете притворяться, что работаете в конечном поле, а затем делите на иррациональное число, или, скорее, можете, но это не имеет смысла. Вы просто получите некоторые нерелевантные иррациональные результаты, которые не имеют никакого отношения к ответу, который вы хотели. Вам нужно будет все это сделать в R, если вы пойдете туда. Для этого требуется вычислить чрезвычайно большие числа, а затем взять остаток, числа с плавающей запятой в какой-то момент превзойдут точность и дадут вам вздор. Бит с весом 1 всегда важен, если вы собираетесь взять остаток, как это, но он не обязательно присутствует в числе с плавающей запятой, в зависимости от экспоненты. Но, возможно, вы это знали, и именно поэтому вы решили не делать этого.
Вы также не можете сделать это с помощью математики конечного поля в этом случае. Iff 5 - квадратичный вычет в поле, в котором вы работаете, эта конструкция все еще работает. A и B не будут phi и phibar, но (sqrt (5) +1)/2 и (1-sqrt (5))/2 соответственно, которые в конечной математике поля будут работать на «смешные номера», которые выглядят полностью не связанные с phi и phibar (но на самом деле являются их конечным полевым аналогом). И, конечно, если вы сделаете это, в вашем коде не будет Math.sqrt
. Вам нужно число x
такое, что x * x = 5
по модулю что-то, а не диадическое рациональное приближение решения среди реалов.
Квадратный корень из 5 должен существовать для любого из этого, чтобы работать, но по модулю 1000000007, 5 не имеет квадратного корня.
следующие работы по модулю 1009: 856 * (627 п - 383 п)
Другие алгоритмы все еще работают, такие как повышение определенную матрицу 2х2 на п-й степени, и его слегка оптимизированную версию (избегая избыточных вычислений).