用上古卷轴5烹饪拓展mod欧几里得求123(mod17)的逆

推荐这篇日记的豆列
······有限域逆元算法的实现-360文档中心
360文档中心免费免积分下载,各行业
知识、技术、信息等word文档下载网站
有限域逆元算法的实现
近世代数第30卷第17期计算机工程2004年9月y01.30§砸l7ComputerEngineeringSeptember2004?开发研究与设计技术?文章编号:tooo_3428(2004)17珈184一12文ilitltiiRtist:A中图分类号:TN918
有限域逆元算法的实现
刘文江,董威,戎蒙恬
(上海交通大学信息安全学院,I:海200030)
摘要:在扩展欧几里得算法的基础上提出了有限域乘法逆元的计算方法。给出了该算法的硬件结构图。该算法的优点是其¨寸问复杂度和空问复杂度较优,便于VLSI的实现。
关健词:有限域;乘法逆元;椭刚曲线;欧儿里得
ImplementationforComputingDivisioninGaloisFields
LIUWeniiang,DONGWei,RONGMengtian
(CollegeofInformationSect.’.cy,ShanghaiJiaotongUnivet‘sity,Shanghai200030)
【Abstract】Animplementationfol‘computingmultiplicativeinversesinGaloisfieldsGF(2…)ispresentedTilealgoi’ithmisbasedonamodificationofEuclid’Salgorithm.Thefll’chitectureofCircletbrVLSlisalsopl’esented.
【Keywords】Finitclield;MuItiplicativeinvel‘se;ECC;Euclid
随着非对称密码学的发展,椭圆曲线(ECC)密码学因数器的变化。
为其独特的优势,渐渐取代RSA在非对称密码学中的地位,表1寄存器和计数器数据
现j'EECC;一泛使用在无线通信不NSmart卡中,完成加密、签Sif=nalsRegistel‘SCounlel名等功能。ECC的优势在于它可以使用比RSA少得多的比特‰S…Delta=0RS【JVDelta数目的密钥达到同样的保密效果。尽管这样,ECCff,的密钥()XXxRS、UVDelta4l长度还是比较大的,实际应用中的密钥长度有192、256等不0()SSRxVLJDeIta+I同等级,应用中涉及到大数的存储和运算,因此对空间和时ORxSU/xVDeIla—l问的要求特别高,本文充分考虑了二者的复杂度,提出了扩l0x.(S-R)Rx(V—U)UDelta+1展欧几里得算法,具有很好的效果。Rx(S-R)U/xV.UDelta.1l欧几里得算法简化上表,同时引进两个变量T币tlW,这两个变量的值是
有限域GF(2”1)是包含92…个元素的代数系统,该系T=SW=Vrm一0或者s。=0
统的每个元素都能够表示成小于Fi]次的多项式,该多项式的T=S—RW=V—Ur。=s。=1
每个系数要么是1,要么是0。在有限域上定义了加法、减简化后寄存器和计数器数据见表2。
法、乘法、求逆运算。下断提到的B(x)是需要求逆的多项表2简化后寄存器和计数器数据
式,它是定义在GF(2111)中的元素。F(x)是一个定义在GFfn“r,n=0Ii,二i(2…)不t习‘约多项式。求逆的算法有很多种,本文在利用扩Dclta=ODeIta<>O展欧几里德O',Jbl4算两个多项式的最大公约数的基础上,提出RB(X)xRxrR了?个基于有限域的乘法逆元的算法。SF(x)rRx_r
Inversion:UxUxWU/x
l?:=r(x);Ddta:=0;S:=I?(x);R:=B(x):V:=();U:=1;V()WUW
I:ori:==l【o2mdoDehaODelta+IDcIta+lDelta—lII’lji=0
thenR:=×.R:U=fxU)MODr:DeIta—P=J;寄存器R和S有数据来往,u,uv寄存器有数据来往。ElscR、s,uu、V之间没有数据交换,引入下面4个控制信号:1fs。=IthenS:=S—R:V:=(V—U)MOD17:End;MultR:=(rm一0)
S:=x.S:MuttU:=(rm一0)OF(delta=0)
Ifdelta=0thenSwtich:=(‘f1)&(delta=0)
(R卜_+S);(U(一>V);U:=(x.U)MODF;delta:=IReduce:=(I'm=1)&(Sin=1)
lglse
U:=(U/x)MODF:Dclta一=1;多项式R;fUS放在(m+1)比特的寄存器‰…r0]和
End;[S。…S(,]中。u和V分别放在m比特寄存器[u。…u0]和End;
End;(B“(x)二=U=V)
2硬件实现基金项目:国家“863”计划基金资助项目(863一104—01一02)
作者简介:刘文江(1975一),男,硕士生,主研方向:ECC;董
首先观察--fiR、S、U、V寄存器的数据流,表1根据L。威,硕士生;戎蒙恬,博导和Is。以及delta的值确定rR、s、u、V寄存器的数据流和计收稿日期:2003.09,09
.184一’
万 方数据
免费下载该文档:
有限域逆元算法的实现的相关文档搜索
有限域逆元算法的实现刘文江,董威,戎蒙恬 (上海交通大学信息安全学院,上海 200030) 摘要: 在扩展欧几里得算法的基础上提出了有限域乘法逆元的计算方法。给出了该...快速有限域计算算法与实现研究_IT/计算机_专业资料。有限域上的算法电子...由于有限域上的运算中,计算域元素的逆元以及域元素相乘是消 耗时间最多的两个...龚 书等: 一种椭圆曲线密码加密算法及其实现 一种椭圆曲线密码加密算法及其实现...关键词 椭圆曲线密码学, 有限域乘法器, 有限域乘法逆元,? 实现 $ % 最关键...满足上述条件的域是有限域 ?总可以找到逆元 ? 用扩展欧几里德算法去求 例: GF(23) 计算上的考虑 ?由于系数只有0和1,多项式可以用二进制数表示。 ?加法既是...? 在以上运算基础上的集合S为有限域。 乘法逆元的求法 EXTENDED EUCLID(m, ...难以用软件有效的实现算法 AES的背景 ? 日,NIST发起征集高级加密...一种椭圆曲线密码加密算法及其实现一种椭圆曲线密码加密算法及其实现隐藏&& 龚 书...可 关键词 椭圆曲线密码学, 有限域乘法器 , 有限域乘法逆元, ? K P实现 ...有限域GF(2n)的一种除法运算算法_数学_自然科学_专业资料。第1 2卷第 2期 ...求逆元 运算和 除法运 算. 在此 基础上 论述 了基 于高斯 消元 法的 ...密(研)4-数论和有限域的基本概念_电脑基础知识_IT/计算机_专业资料。第4章 ...0; if (b&0) b += } 28 扩展的Euclid算法求乘法逆元 ...crypto4c-ch04-有限域 34页 免费 有限域 35页 免费 RS码编译码算法的实现(...? 它们构成有限域– 1 0 1 1 0 0 0 1 因为关于乘法有逆元 ? 可以在域...Bachet 的 算法允许在有限域 Z p 中计算逆元。 到了 19 世纪,人们所研究到的域有:有理数域、实数域、复数域和模素数 P 的剩余类域等,然而第一个有具体...21175人阅读
数论(68)
今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。
对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。
逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为。
推导过程如下
&&&&&&&&&&&&&&&&&&&&&&&&& &&
求现在来看一个逆元最常见问题,求如下表达式的值(已知)
&&&&&&&&&&&
当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理。
但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求与互素。实际上我们还有一
种通用的求逆元方法,适合所有情况。公式如下
现在我们来证明它,已知,证明步骤如下
接下来来实战一下,看几个关于逆元的题目。
题意:给定两个正整数和,求的所有因子和对9901取余后的值。
分析:很容易知道,先把分解得到,那么得到,那么
&&&& 的所有因子和的表达式如下
所以我们有两种做法。第一种做法是二分求等比数列之和。
#include &iostream&
#include &string.h&
#include &stdio.h&
typedef long long LL;
const int N = 10005;
const int MOD = 9901;
bool prime[N];
void isprime()
memset(prime,true,sizeof(prime));
for(int i=2; i&N; i++)
if(prime[i])
p[cnt++] =
for(int j=i+i; j&N; j+=i)
prime[j] =
LL power(LL a,LL b)
LL ans = 1;
ans = ans * a % MOD;
a = a * a % MOD;
LL sum(LL a,LL n)
if(n == 0) return 1;
LL t = sum(a,(n-1)/2);
LL cur = power(a,(n+1)/2);
t = (t + t % MOD * cur % MOD) % MOD;
LL cur = power(a,(n+1)/2);
t = (t + t % MOD * cur % MOD) % MOD;
t = (t + power(a,n)) % MOD;
void Solve(LL A,LL B)
LL ans = 1;
for(int i=0; p[i]*p[i] &= A; i++)
if(A % p[i] == 0)
int num = 0;
while(A % p[i] == 0)
A /= p[i];
ans *= sum(p[i],num*B) % MOD;
ans %= MOD;
ans *= sum(A,B) % MOD;
ans %= MOD;
cout&&ans&&
int main()
isprime();
while(cin&&A&&B)
Solve(A,B);
第二种方法就是用等比数列求和公式,但是要用逆元。用如下公式即可
&&&&&&&&&&&&&&&&&&&&&
因为可能会很大,超过int范围,所以在快速幂时要二分乘法。
#include &iostream&
#include &string.h&
#include &stdio.h&
typedef long long LL;
const int N = 10005;
const int MOD = 9901;
bool prime[N];
void isprime()
memset(prime,true,sizeof(prime));
for(int i=2; i&N; i++)
if(prime[i])
p[cnt++] =
for(int j=i+i; j&N; j+=i)
prime[j] =
LL multi(LL a,LL b,LL m)
LL ans = 0;
ans = (ans + a) %
a = (a + a) %
LL quick_mod(LL a,LL b,LL m)
LL ans = 1;
ans = multi(ans,a,m);
a = multi(a,a,m);
void Solve(LL A,LL B)
LL ans = 1;
for(int i=0; p[i]*p[i] &= A; i++)
if(A % p[i] == 0)
int num = 0;
while(A % p[i] == 0)
A /= p[i];
LL M = (p[i] - 1) * MOD;
ans *= (quick_mod(p[i],num*B+1,M) + M - 1) / (p[i] - 1);
ans %= MOD;
LL M = MOD * (A - 1);
ans *= (quick_mod(A,B+1,M) + M - 1) / (A - 1);
ans %= MOD;
cout&&ans&&
int main()
isprime();
while(cin&&A&&B)
Solve(A,B);
其实有些题需要用到模的所有逆元,这里为奇质数。那么如果用快速幂求时间复杂度为,
如果对于一个1000000级别的素数,这样做的时间复杂度是很高了。实际上有的算法,有一个递推式如下
&&&&&&&&&&&&&&&&&&
它的推导过程如下,设,那么
对上式两边同时除,进一步得到
再把和替换掉,最终得到
初始化,这样就可以通过递推法求出模奇素数的所有逆元了。
另外模的所有逆元值对应中所有的数,比如,那么对应的逆元是。
题意:求中互质的数的个数,其中。
分析:因为,所以,我们很容易知道如下结论
&&&& 对于两个正整数和,如果是的倍数,那么中与互素的数的个数为
&&&& 本结论是很好证明的,因为中与互素的个数为,又知道,所以
&&&& 结论成立。那么对于本题,答案就是
&&&&& 其中为小于等于的所有素数,先筛选出来即可。由于最终答案对一个质数取模,所以要用逆元,这里
&&&&& 求逆元就有技巧了,用刚刚介绍的递推法预处理,否则会TLE的。
#include &iostream&
#include &string.h&
#include &stdio.h&
#include &bitset&
typedef long long LL;
const int N = ;
void isprime()
prime.set();
for(int i=2; i&N; i++)
if(prime[i])
for(int j=i+i; j&N; j+=i)
prime[j] =
LL ans1[N],ans2[N];
LL inv[N];
int main()
isprime();
int MOD,m,n,T;
scanf(&%d%d&,&T,&MOD);
ans1[0] = 1;
for(int i=1; i&N; i++)
ans1[i] = ans1[i-1] * i % MOD;
inv[1] = 1;
for(int i=2;i&N;i++)
if(i &= MOD)
inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
ans2[1] = 1;
for(int i=2; i&N; i++)
if(prime[i])
ans2[i] = ans2[i-1] * (i - 1) % MOD;
ans2[i] = ans2[i] * inv[i % MOD] % MOD;
ans2[i] = ans2[i-1];
while(T--)
scanf(&%d%d&,&n,&m);
LL ans = ans1[n] * ans2[m] % MOD;
printf(&%lld\n&,ans);
接下来还有一个关于逆元的有意思的题目,描述如下
&&&& 所以只需要证明,而我们知道模的逆元对应全部
&&&& 中的所有数,既是单射也是满射。
&&&& 所以进一步得到
&&&&& 证明完毕!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1616051次
积分:20101
积分:20101
排名:第315名
原创:478篇
转载:42篇
评论:390条
(1)(4)(3)(4)(38)(4)(1)(2)(5)(1)(4)(2)(1)(7)(10)(8)(8)(12)(16)(31)(20)(28)(49)(28)(17)(42)(18)(29)(26)(15)(3)(8)(9)(8)(11)(3)(46)拓展欧几里得_ASP.NET技巧_动态网站制作指南
拓展欧几里得
来源:人气:11
辗转相除法
int gcd(int a, int b){ return a == 0 ? b : gcd(b % a, a); }
拓展欧几里得算法
ll exgcd(ll a, ll b)
if(b == 0)
x = 1, y = 0;
ll ans = exgcd(b, a%b);
y = tmp - (a / b) *
例题:同余方程 Mod
No2012提高组复赛Day2T1
求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。
输入只有一行,包含两个正整数a, b,用一个空格隔开。
输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。
超裸的题,直接上拓展欧几里得
#include&iostream&
#include&cstdio&
#include&cstring&
#include&cmath&
ll exgcd(ll a, ll b)
if(b == 0)
x = 1, y = 0;
ll ans = exgcd(b, a%b);
y = tmp - (a / b) *
int main()
cin&&a&&b;
exgcd(a, b);
x = (x + b) %//防止出现负数
优质网站模板}

我要回帖

更多关于 拓展欧几里得 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信