原根算法C语言,算法导论-----数论-----元素的幂

1.为a反复相乘生成

9c6117a9d19738ad53deab122ca2a068.png的子群,

df46765efa995abe2be215fc76b6cc8c.png(a)为a在

5e0547c3a086bfeb859cb17e051bbfd3.png中的阶,phi为

bfb40bc11327e92796d1193bf5ada9cb.png规模

2.欧拉定理:对n>1,

f2ae2f375d6114bec1118b1f2b4be7fc.png=1(modn),对所有a属于

34975db83c4cd8184d6a8861e88d483a.png成立

3.费马定理:p素数,,

981478c4452dd8cfa2feeaeed872272d.png=1(modp) 对所有a属于

ff212aa57ad1d32c710062f57a7fd7a2.png成立

4.原根:

01a6046726da1bb866372e435647aeb6.png(g)=|

81ed931961c403eb53fcf84579bda6b9.png|,对模n,

086fd30d7a3f530460da2b5e6b3a9934.png每个元素都是g的幂,g是

915a9537b34cc5b59668292e22499376.png的原根或生成元

3d5388ca6a71f5a459c717e6a5147b33.png包含一个原根,则

96eede74fb4baec1da774b3deb5d04c7.png循环群

5.对所有素数p>2和正整数e,满足

75e898e826fc7cabc422e410a0ce93c2.png循环群n的值为2,4,

c78da3866fbc78a6e4156119c6256ef3.png

6.离散对数:g是

38cd03ed3afad1460d72b9b55db731c1.png中的原根,a是

29cad3d91efc4ba25219dbb879d3bb8a.png中任一元素,存在z使,

82d27266775f212cde67789bcb9b3188.png=a(modn),z称为离散对数,即

64401fe5cb30b3edf91e6446f0261e15.png

7.离散对数定理:g是

23115823d6abb525429a68a9c128c87f.png原根,则

8ced82e1927a0ec077cea308f20109c4.png=

aed95af0e205fa24a90f9ccdb34fa622.png(modn)成立,当且仅当x=y(modφ(n))成立

8.p 是奇素数且e>=1,则方程

4348285a7614d7090e1cf31371021905.png仅有两个解,x=1和x=-1

证明:

因为

72684705ae6d0dec980cc73601effe5b.png,所以必有原根,设n=

6c9f517b1308dc8a26e63a7e52a91959.png

3572cebd92f5db6ed56f62da056e2a04.png,

861ef5cc3168560a79988fcee2d8dddc.png=

0b1e289a36ff4ccc158c61d0bf2d93f2.png(modn),

1e9b2c5d482abd87e8801fd743a7a112.png)=

b1532dcf81fde2a24a4775a5768a8dc3.png=0(modφ(n))

φ(n)=(p-1)

f714656e038156ef6b936665493d5234.png,gcd(2,

672981d7ef119e8efda0b902aa22a65a.png)=2,d=2,且0|2,有两个解,1,-1.

9.平凡平方根:1,-1

10.模n存在1的非平凡平方根,n是合数

11.反复平方法求数的幂(c无用),所需位操作次数O(

274581a7eadab5d516f7bdb8b73362ba.png) β为位数

注:下面代码多乘一个a的原因:

举例:a^10=a^5*a^5

a^5=a^2*a^2*a

MODULAR-EXPONENTIATION(a,b,n)

{

c =0;

d =1;

letbe the binary represention of b;

for(i from k down to 0 )

c=2c;

d=(d*d)modn;

if(bi==1)

c=c+1;

d=(d*a)modn;

return d;

}

c语言的两种写法

1.递归

__int64 exp_mod(__int64 a, __int64 n, __int64 b)

{

__int64 t;

if(n==0) return 1%b;

if(n==1) return a%b;

t=exp_mod(a,n/2,b);

t=t*t%b;

if((n&1)==1) t=t*a%b;

return t;

}

2.递推

__int64 modexp(__int64 a,__int64 b,__int64 n)

{

__int64 ret=1;

__int64 tmp=a;

while(b)

{

//基数存在

if(b&0x1) ret=ret*tmp%n;

tmp=tmp*tmp%n;

b>>=1;

}

return ret;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值