Вы можете сделать это, вычислив (в ZM[x] / x²-b)
(a+x)^n+(a-x)^n mod (M, x^2-b)
где снова вы можете использовать модульное деление пополам и квадрат для степеней, где промежуточные результаты теперь являются линейными многочленами (по модулярным целым числам). На самом деле вам понадобится только одна из степеней, в результате получается удвоенный постоянный коэффициент.
В качестве альтернативы эти степенные комбинации являются решением линейной рекурсии 2-го порядка.
u[n+2]-2*a*u[n+1]+(a^2-b)*u[n]
куда
u[0]=2 and u[1]=2*a
так что вы можете использовать быстрое матричное возведение в степень системной матрицы этой рекурсии, снова получая алгоритм O (log (n)) (без учета битового размера).
Пример: согласно комментарию возьмите a=3, b=8, n=2 (и целые числа по модулю M=10^9+7, пример недостаточно велик, чтобы это имело значение)
В первом варианте вычислить u[n]=(a+x)^n mod (M, x^2-b), поэтому
u[0]=1
u[1]=3+x
u[2]=(3+x)^2 mod (x^2-8)=9+6x+8=17+6x
и удвоенный постоянный член равен 2*17=34
Во втором варианте рекурсия (с 2*a=6, a^2-b=1)
u[n+2]-6*u[n+1]+u[n]=0
так что первые элементы последовательности
u[0]=2
u[1]=6
u[2]=6*u[1]-u[0]=34
person
Lutz Lehmann
schedule
15.06.2014