1. 程式人生 > >BSGS與二次剩餘

BSGS與二次剩餘

BSGS

我們要求axb(modp)中x的值,其中p為質數,或者a和p互質。
x可以寫成:x=ik+j,其中k為常數。
那麼aik+jb
aikajb(modp)
那麼我們可以預處理每一個j的ajb,存進set或者map裡,然後列舉i,看看map裡存不存在aik。當k=φ(p)的時候複雜度最優。
當p和a不互質的時候,可以先把他們的gcd除乾淨(兩邊同時除gcd(a,p)之後可能gcd(a,p/d)!=0)

二次剩餘

我們要求

x2a(modp)中x的值,其中a<p且a!=0,p為質數,p=2我們不討論,0我們直接出解嘛。
如果a存在解,那麼我們把a叫做模p意義下的二次剩餘,否則為二次非剩餘。
先來研究一些性質。
定理1:對於一個p,有(p-1)/2個二次剩餘。
證明:x20<x1,x2<pp|(x12x22),那麼p|(x1x2)(x1+x2)x1x2顯然不能是p的倍數,那麼x1+x2=p,這樣,我們發現每個x的平方會和另一個x的平方同餘,而且他們的和為p,由於只有p-1個x,那麼
x2
的值就只有(p-1)/2個。
定理2:若a(p1)/21,那麼x不存在,若=1,那麼x必定存在且有兩個,記為x1,x2,其中x1+x2=p。
證明:若=-1,那麼由原方程可以推出xp11,又有費馬小定理xp11,矛盾,所以x不存在。後者就是定理一的內容。
定義一個數的勒讓德符號(ap)他的取值有三個,1,-1,0,1代表a是p下的二次剩餘,-1代表不是,0僅當a%p=0。那麼易得(ap)=a(p1)/2

好了,現在我們來求x:
如果a不是二次剩餘,返回無解。
如果是,那麼有一個可行的做法如下:
首先找到一個c,使得

c2a的勒讓德符號為-1,也即無法開根。
定義同餘複數域,一個複數v=(a+bi),其中i=c2a,乘法等運算和通常意義上的複數一樣。
有一個很強的結論: