1. 程式人生 > >【模板】二次剩餘Cipolla演算法/尤拉準則-bzoj5104: Fib數列

【模板】二次剩餘Cipolla演算法/尤拉準則-bzoj5104: Fib數列


尤拉準則

對於質數 p p x 2 a (

m o d p ) a p
1
2
1 ( m o
d
p ) x^2\equiv a\pmod p\Leftrightarrow a^{\frac{p-1}{2}}\equiv 1\pmod p

證明:

充分性:
a p 1 2 = ( x 2 ) p 1 2 = x p 1 1 ( m o d p ) a^{\frac{p-1}{2}}=(x^2)^{\frac{p-1}{2}}=x^{p-1}\equiv 1\pmod p

必要性:
g g 為模 p p 意義下的原根, g i a ( m o d p ) g^i\equiv a\pmod p ,則
g i ( p 1 ) 2 1 ( m o d p ) g^{\frac{i(p-1)}{2}}\equiv 1\pmod p
g g 為原根,則 ( p 1 ) i ( p 1 ) 2 (p-1)|\frac{i(p-1)}{2} i i 為偶數, x g i 2 ( m o d p ) x\equiv g^{\frac i2}\pmod p


Cipolla演算法

一種求解模奇質數意義下的二次同餘方程的演算法。

p p 為奇質數,給定 a a ,求 x x 滿足: x 2 a ( m o d p ) x^2\equiv a\pmod p

複雜度 O ( log p ) O(\log p)

具體演算法:

可能需要死記硬背一下。。。

隨機找到任意一個 b b ,滿足 b 2 a w b^2-a\equiv w w w 是模 p p 意義下的非二次剩餘( w p 1 2 1 ( m o d p ) w^{\frac{p-1}{2} }\equiv -1\pmod p )。

類似於虛數,設 i = w i= \sqrt w ,擴域後每個數表達為 ( a , b ) = a + b i (a,b)=a+bi ,運算為:
( r 1 , d 1 ) + ( r 2 , d 2 ) = ( r 1 + r 2 , d 1 + d 2 ) (r_1,d_1)+(r_2,d_2)=(r_1+r_2,d_1+d_2)
( r 1 , d 1 ) ( r 2 , d 2 ) = ( r 1 r 2 + d 1 d 2 w , r 1 d 2 + r 2 d 1 ) (r_1,d_1)·(r_2,d_2)=(r_1 r_2+d_1d_2w,r_1d_2+r_2d_1)

< G , + , > <G,+,·> 是個環,滿足交換律和結合律。

答案即為: x = ( b + i ) p + 1 2 x=(b+i)^{\frac {p+1}{2}}