什么是计算机程序设计?
看起来好像是一大段废话,勒让德只是站在巨人的肩膀上总结了一下而已。
其实勒让德还总结了一些性质,不过一般只用得到欧拉判别准则,不够勒让德符号是个积性函数可能还有点用。
但还是不知道如何判断n是否为p的二次剩余,往下看欧拉判别准则
ll Legendre(ll a, ll p)
{
return qsm(a, (p-1)/2, p);
} 12341234
欧拉判别准则
先来回顾一下欧拉定理xφ(p)≡1(modp)
因为这里的p是奇质数,所以xp?1≡1(modp)
对xp?1进行开方操作,在虚数域中xp?12≡±1(modp),如果等于1就肯定开的了方,为-1一定开不了。所以x是否为n的二次剩余就用这个欧拉判别准则。
if(qsm(n,(p-1)/2)==p-1){ printf("No root\n");
continue;
}12341234
-1在mod p意义下为p-1。
算法流程
给出n和p
就算我们n关于p的勒让德符号为1,那么要怎样取开n的方呢?
现在是脑洞大开的时候。
找一个数a
我们随机一个数a,然后对a2?n进行开方操作(就是计算他勒让德符号的值),直到他们的勒让德符号为-1为止(就是开不了方为止)。
就是找到一个a满足(a2?n)p?12=?1
先不要管为什么,后面会讲,我们现在就默默的去膜拜Cipolla的脑洞很大。
while(1){
a=rand()%p;
w=(a*a-n+p)%p; if(qsm(w,(p-1)/2)==p-1)break;
}1234512345
因为是随机找a,那么会不会要找很久。
答案:不会!
?定理1:x2≡n(modp)中有p?12个n能使方程有解
?证明定理1:x2≡n(modp),如果存在不同的数u,v,使他们带入x后可以使方程有解,那么很显然满足u2?v2|p,所以满足(u+v)(u?v)|p,因为
u2?v2|p所以p不可能是(u-v)的倍数,所以(u+v)|p,那么这样的数对在p中存在的数量为p?12
根据定理1,随机找a的期望为2。
建立一个复数域
说是建立,其实根本不用程序去打,说是建立复数域只是跟方便理解。
在平常学的复数域中,有一个i,满足i2=?1。
我们也建立一个类似的域,因为我们要对于a2?n开方,而a2?n有不是p的二次剩余,所以我们定义ω=a2?n?????√。那么现在的ω也像i一样,满足ω2=a2?n,这样我们就定义了一个新的域。
struct CN{
ll x,y;
CN friend operator *(CN x,CN y){
CN z;
z.x=(x.x*y.x%p+x.y*y.y%p*w%p)%p;
z.y=(x.x*y.y%p+x.y*y.x%p)%p; return z;
}
}u,v;123456789123456789
像正常打复数运算一样我们定义一下运算符。可以发现z.x那个地方后面是*w而不是*1,因为现在的域单位复数为ω,满足ω2=a2?n,而不像正常复数的i2=?1。在这个域中的表示方式类似正常的复数:a+bω
得出答案
我们要求的是x2≡n(modp),x的值
我们现在知道了a和ω之后,就能得出答案了。
答案=(a+ω)p+12
真的吗?真的!但是这个答案不是由实数和虚数组成的吗?
根据拉格朗日定理,可以得出虚数处的系数一定为0。
CN Cqsm(CN x,ll y){\\复数的快速幂 CN z;z.x=1,z.y=0;\\注意初始化 while(y){ if(y&1)z=z*x;
x=x*x;
y/=2;
} return z;
}123456789123456789
w=(a*a-n+p)%p;
u.x=a,u.y=1;//为什么u.y是1——在复数的统计中只用统计系数就好了
u=Cqsm(u,(p+1)/2);
ll yi=u.x,er=p-u.x; if(yi>er)swap(yi,er); if(yi==er){ printf("%lld\n",yi);
} else{ printf("%lld %lld\n",yi,er);
}12345678910111234567891011
为什么会有两个答案,比如4√=±2,x2≡(p?x)2(modp)很显然,因为把后面拆开x2≡x2?2px+p2(modp),把p都约去,所以x2≡(p?x)2(modp)。
证明原理
再搞出一些定理方便说明。
定理
?定理2:(a+b)p≡ap+bp(modp)
?证明定理2:根据二项式定理:
(a+b)p≡∑pi=0Cipap?ibi(modp)
≡∑pi=0p!(p?i)!i!ap?ibi(modp)
可以发现,只有当i=0或i=p的时候式子没有p的因子,所以中间有p的因子的都可以省略,所以(a+b)p≡ap+bp(modp)
?定理3:ωp≡?ω(modp)
?证明定理3:ωp
=ωp?1?ω
=(ω2)p?12?ω
=(a2?n)p?12?ω——因为ω2=a2?n
=?ω——因为满足(a2?n)p?12=?1
?定理4:ap≡a(modp)
?证明定理3:ap根据费马小定理
≡ap?1≡1(modp)
所以ap≡a?ap?1≡a(modp)
推导
问题:x2≡n(modp)求解x
Cipolla:x≡(a+ω)p+12(modp)的实数
直接把式子转化:
(a+ω)p+12(modp)
≡((a+ω)p+1)12(modp)
≡((a+ω)p(a+ω))12(modp)
≡((ap+ωp)(a+ω))12(modp)根据定理2
≡((a?ω)(a+ω))12(modp)根据定理3和定理4
≡(a2?ω2)12(modp)根据定理3和定理4
≡(a2?(a2?n))12(modp)满足ω2=a2?n
≡n12(modp)
所以(a+ω)p+12≡n12≡n√(modp)
这脑洞太大了!!!!!!!!!!!!!!
以上就是计算机程序的算法小记的详细内容,更多请关注Gxl网其它相关文章!