二次剩余的判别方法-高斯引理(下)
写在前面:推荐教材为《信息安全数学基础》,书上知识丰富,但许多细节描述得不够到位
希望通过自己的解读,帮助大家节省一些时间来理解这些东西的含义。
上篇我们看到了,可以通过Aa最小绝对值剩余中负数个数来判断a是不是二次剩余
然而这样做比欧拉判别条件累多了,所以这个定理的价值何在呢?
展开今天的话题
我们继续考察数组Aa={1a,2a,......(p-1)a/2},我们先介绍T函数
设p是奇素数,T(a,p)=sum([Aa/p])
看几个例子
T(2,7)=[2*1/7]+[2*2/7]+[2*3/7]=0
T(4,7)=[4*1/7]+[4*2/7]+[4*3/7]=2
T(5,7)=[5*1/7]+[5*2/7]+[5*3/7]=3
第一次在书上看到这个函数迷惑了很久,几周之后再回头思考,才明白了T函数的实际含义,说出来很简单,就是保护取模后的奇偶性。
怎么个保护法?看例子:
如果你想利用模7判断9的奇偶性,你会发现9变成了2,是个偶数,所以9是偶数??funny!
正确的操作是,引入一个保护位[9/7],9=9%7+[9/7] mod 2,很直观呀,模奇素数,过一个周期奇偶性就对换一次,我们加上周期数就能保护奇偶性了。
T函数就是保护了Aa数组的奇偶性,我们以T(5,7)为例:
5+10+15 = 5+3+1+T(5,7) mod 2 =5+3+1+3=12mod2是偶数!
你可能会发问这么做不是折腾嘛,没错,但是至少给了我们利用模判断奇偶性的方法。
下面我们来看高斯是如何利用它来攻克难题的!
我们来考察sum(Aa)的奇偶性,我们记1到(p-1)/2的求和为S((p-1)/2):
直接求和法:sum(Aa)=a*S((p-1)/2) mod 2······························(0)
取模法:sum(Aa)=sum(Aa%p)+T(a,p) mod 2 ·························(1)
sum(Aa%p)=sum(Aa最小绝对值剩余)+负数个数*p···················(2)注:负数个数是指数组Aa={1a,2a,......(p-1)a/2}中取绝对值最小剩余后负数的个数
sum(Aa最小绝对值剩余)=sum(|Aa最小绝对值剩余|)·················(3)
sum(|Aa最小绝对值剩余|)=S((p-1)/2)·····································(4)
是不是像一个递归程序,毕竟编程多年,脑袋变成堆栈了哈哈
回溯上去,得到
sum(Aa)=S((p-1)/2)+负数个数*p+T(a,p) mod 2
p是奇数不影响负数个数的奇偶性
即 sum(Aa)=S((p-1)/2)+负数个数+T(a,p) mod 2
带入0式,于是得到 a*S((p-1)/2)=S((p-1)/2)+负数个数+T(a,p) mod 2
移项得 (a-1)*S((p-1)/2)=负数个数+T(a,p) mod 2·················(INF)
这个式子是核心,我们标为INF
如果a是奇数,那么a-1是偶数,负数个数和T(a,p)奇偶性一致,因此Legendre(a,p)=(-1)^T(a,p)
如果a是2,很不幸T(2,p)阵亡为0([2/p]+[4/p]+.......+[(p-1)/p]=0)
负数个数=S((p-1)/2) mod 2,Legendre(a,p)=(-1)^S((p-1)/2)
最后感慨几句:
我很伤心,因为在实验室写着写着电脑快没电了,于是误以为Ctrl+s就能保存,然后关了电脑回宿舍拿充电器,打开电脑发现啥都没了,提醒一下大家。
再放上一个小心愿,希望在博客园遇到一些热爱探索知识细节的朋友,把问题挖掘到底!许多同学总是对我爱自己造轮子表示不满意,说我学傻了什么的
虽然我写出来的代码确实漏洞百出,但是一个比特不是在自己掌控中填上的,就不能安心,毕竟是为求知而来 。取这个网名,也是一种心态,虽然自己
很弱,但是不妨碍去不懈前进和探索,讲述自己对知识的理解,哪怕每天效率再低,哪怕他们多么看不起我做的事。