数论基本理论的整理

来源:互联网 发布:2017双11实时数据 编辑:程序博客网 时间:2024/05/22 15:56

1. 大整数情况,衡量问题复杂度是输入的整数的位数,衡量效率是位操作的次数。

2. 除法定理:a=qn+r, 余数为r<n;

3. 取模可以划分等价类,[a]n表示模n后余数为a的数即 a+k*n; 

例如[3]7=[-4]7=[10]7中,k分别取 0,-1,1. 等价类的代表元是3,3+k*7即等价类的所有的元素

4. 用Zn表示所有的模n的等价类地集合即Zn={[a]n: 0<=a<=n-1},即所有的a代表的那些等价类

5. a=qn,记录为  n|a,即 n是a的约数

6 模运算定义群:群(单位元,逆元,结合律的代数结构:操作加集合)

6.1 定义集合Zn上的群,注意Zn是集合的集合,即Zn中的元素是等价类

如果a~a'(mod n),b~b'(mod n)

则 a+b~a'+b' (mod n)  (a+k1*n)+(b+k2*n)=(a+b)+(k1+k2)*n=[a+b]n

     a*b~a'*b' (mod n)     (a+k1*n)(b+k2*n)=ab+(a*k2+b*k1+k)n=[ab]n,  注意,这里a,b要与n互质,否则ab+(a*k2+b*k1+k)n=k*n即变成了0的等价类

因此定义等价类的加法为其代表元的加法,等价类的乘法为其代表元的乘法[a]n+[b]n=[a+b]n, a[n]*b[n]=[ab]n

例如Z6集合中的元素为[0]6,[1]6,[2]6,..[5]6即每个元素都是一个等价类

[2]mod6 *  [5]mod6==[2*5]mod6=[4]mod6

6.2 Zn*的定义,  Zn集合中的元素时等价类,这些等价类中所有代表元与n互质的那些等价类的集合即Zn*

例如Z15*={ [1],[2],[4],[7],[8],[11],[13],[14]  }

6.3  Zn*集合上的乘法操作构成乘法群,求逆元用推广的欧几里得算法

ax+ny=1  移项得 ax=1-ny=1+kn  即 ax~1modn,

例如 [5]mod11, a=5,n=11,  extended_euclid(a,n)=(d,x,y)=(1,-2,1),于是 1=a(-2)+n*1=5*(-2)+11*1, 因此-2是模11乘法下5的逆元

6.4  ax~b modn

这种形式表示的含义是[a]n*[x]n=[b]n

 

7.  线性  模方程

7.0

同余的概念是这样描述的:

设m是一个给定的正整数,如果两个整数a,b用m除,所得的余数相同,则称a,b对模m同余。

所谓线性同余法(又叫混合同余法),就是这样的一个公式:X[i+1]=(A*X[i]+C) mod M;

7.1 用推广的欧几里得算法求交换群中乘法的逆元

http://blog.csdn.net/sinapme/article/details/17296799  该文章中详细注解了推广的欧几里得算法 extended-euclid求解 d=gcd(a,b)=ax+by返回 (d,x,y)三元式的结论。 其中gcd因子d的求解和一般的欧几里得算法一致。

利用该算法可以求Zn*中元素的乘法逆元,设a是Zn*中的元素,即 a代表等价类 [a]n, 求extended-eulicd(a,n)得到(d,x,y),因为Zn*中都为质数,所以gcd为1.即(1,x,y)即 ax+by=1即 ax+yn=1, 也即 ax~1modn,因此x是a的逆元。

7.2 线性模方程的定义:

求解 ax~b(mod n) 即 ax=b+kn这个方程,求出所有符合条件的x,这种方程称为 线性模方程

设<a>表示由 [a]mod n生成的Zn的子群(这种群称为循环群)。注意Zn是加法群,因此<a>=a^x=a+a+..+a一共加了x次=a*x, 也即ax是Zn上(注意Zn表示的是等价类【i】n的集合)的加法群因此ax~b这个线性模方程有解的条件是b 属于 <a>

7.3 线性模方程有解的条件:

定理:设d=gcd(a,n),则 <a>=<d>={0,d,2d,.....(n/d-1)d}即d的倍数,因此线性模仿成有节的条件是 gcd(a,n)|b即  d是b的因子,即b=p*d属于{0,d,2d,....(n/d-1)*d},或者说这 n/d个都是 ax~b的解,如果 gcd(a,n)不是b的约数,则 ax~b无解。

即要么有d个解,要么无解。

7.4 线性模方程的初始解

上面论证了线性模方程有解的条件,n/d个解是相互联系的,因此求出一个解就可以获得所有解。

首先用extended-euclid方法求出d=gcd(a,n)=ax'+ny',  如果d|b即d是b的约数,

则初始解为x0=x‘(b/d)mod n (注意对于乘法群,可以通过extended-euclid来求解a元素的逆元, 即通过1=ax'+ny求出a的逆元x’)

这里d=ax'+ny'求出的是满足  ax'~d的 x‘,  而d|b,即d是b的约数,因此,  ax'~b的解为  x' (b/d) mod n,

 

注意 d|b,因此b/d是无需取模的

有了这个初始解,就可以构造出所有的解  xi=x0+i(n/d)

7.5 程序

modular-linear-equation-solver(a,b,n) //即 ax~bmodn 的解

(d,x',y')=extended-euclid(a,n)

if (d|b)

{

x0=x'(b/d)modn

foreach(i)

{

xi=x0+i(n/d) mod n

}

}

else

{

print “无解”

}

7.6 实际例子

求解 14x~30 mod100, 即 ax~bmodn

extend-euclid(a,n)=extended-euclid(14,100)返回(d,x,y)=(2,-7,1)因此d|30,因此有解

x0=x’*b/d=(-7)*30/2mod100=-105mod100=95mod100

一共有d个解,另一个是 95+i*n/d=95+i*100/2=95+i*50=45;
0 0
原创粉丝点击