导航:首页 > 源码编译 > 欧几里得算法求逆元

欧几里得算法求逆元

发布时间:2023-01-14 17:00:05

1. 欧几里德算法是什么啊

欧几里德算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

定理:gcd(a,b) = gcd(b,a mod b)

证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数

假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:

void swap(int & a, int & b)
{
int c = a;
a = b;
b = c;
}
int gcd(int a,int b)
{
if(0 == a )
{
return b;
}
if( 0 == b)
{
return a;
}
if(a > b)
{
swap(a,b);
}
int c;
for(c = a % b ; c > 0 ; c = a % b)
{
a = b;
b = c;
}
return b;
}
参考资料:internet

2. 扩展欧几里得算法求乘法逆元1234

Q X1 X2 X3 Y1 Y2 Y31 0 4321 0 1 12343 0 1 1234 1 -3 6191 1 -3 619 -1 4 6151 -1 4 615 2 -7 4153 2 -7 4 -307 1075 31 -307 1075 2 309 -1082 14321-1082=3239

3. 在有限域中怎么求一个多项式的逆元

把生成这个有限域的生成多项式作为模多项式,用辗转相除法(欧几里得算法)不停模生成多项式得余式直到1(肯定是1啊,因为给出的多项式有逆元,和模多项式互质的)。(可能模多项式次数比给出的多项式次数高,第一步除以模多项式,商式是0,余式是给出的多项式)
然后如同求ax=1(mod m)一样反向进行,把1用模多项式和给出的多项式的“线性组合”表示出来,给出的多项式的“系数”多项式就是这个多项式的逆元啦。

可以检查一下算错没有,求出逆元后和给出的多项式在模生成多项式下相乘,看是否等于1。

过程中涉及多项式长除法,挺费纸的。
我在网络搜到几篇博客,都是通过mod(x^(n/2))找到与mod(x^n)的关系,求解方法还涉及FFT,这应该属于偏工程的算法吧,没仔细看不是很清楚。

4. 欧几里得辗转相除法

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 另一种求两数的最大公约数的方法是更相减损法。辗转相除法是用来计算两个整数的最大公约数。假设两个整数为a和b,他们的公约数可以表示为gcd(a,b)。如果gcd(a,b) = c,则必然a = mc和b = nc。a除以b得商和余数,余数r可以表示为r = a - bk,k这里是系数。因为c为 a和b的最大公约数,所以c也一定是r的最大公约数,因为r = mc - nck = (m-nk)c。
因此gcd(a,b) = gcd(b,r),相当于把较大的一个整数用一个较小的余数替换了,这样不断地迭代,直到余数为0,则找到最大公约数。
举例两个整数为1071和462:
第一步:1071 / 462 = 2 * 462 + 147
第二步:462 / 147 = 3 * 147 + 21
第三步:147 / 21 = 7 * 21 + 0
此时余数为零,则21为两个数的最大公约数。
贝祖公式表明对于任意两个整数a和b,都可以找到一对可为负的整数x和y,可以使等式xa + yb = m,其中m为a和b的最大公约数,合理性稍加思考可得。如果m为1说明a和b互素。所以在互素的情况下,xa + yb = 1。这个等式对于求乘法逆元有很大的帮助。
那么如何通过贝祖公式及扩展欧几里得算法来求乘法逆元呢?举一个例子来描述什么是乘法逆元。如果ab mod m = 1,或者可以表示为ab ≡ 1 mod m,这里b就是a关于模数m的乘法逆元。计算乘法逆元的方法就是扩展欧几里得算法,以下通过一个例子来帮助理解:
假设我们要求3 关于模26的乘法逆元(隐含了3和26的最大公约数为1,即互素)。当a = 3,b = 26,则根据贝祖公式,存在整数x和y,3x + 26y = 1。
思路就是等号两边同时mod 26,等式则变成(3x + 26y) mod 26 = 1 mod 26,根据模运算的性质(a + b) mod m = (a mod m + b mod m) mod m。
所以展开等式(3x mod 26 + 26y mod 26) mod 26 = 1 mod 26。化简最终得到(3x mod 26) mod 26 = 1 mod 26。我们发现3x mod 26 = 1正好符合了乘法逆元的定义,所以欧几里得算法就是解x的关键。
下面将通过辗转相除法来求x:
第一步:26 = 3 * 8 + 2
第二步:3 = 2 * 1 + 1
统一将余数换到等号左边:
2 = 26 - 3 * 8
1 = 3 - 2 * 1
将第一行的2替换到第二行,保证等式左边永远为1,等式右边变成仅由3x + 26y组成。
1 = 3 - (26 - 3 * 8) * 1 = 3 * 9 + (-1) * 26
可得x = 9
最后9就是3关于模26的乘法逆元。它可以应用于仿射加密
附:仿射加密的公式e(x) = ax + b mod m, 其中a与m互素, b为移动距离。
仿射解密公式d(x) = a-1(x - b) mod m

5. 【总结】逆元的求法



由费马小定理得:

那么将就可以将 拆成 ,得:

根据逆元的定义 就是 的逆元
然而 就可以用快速幂来求
source:

根据上面对逆元的解释:
利用扩展欧几里得算法:
那么对于数 的逆元就是用扩欧找到一个 使
source:

以下公式都应该是在模p意义下的
因为



挪一下再调个边

那么

,这数学公式用的好爽!
参考博客: boshi 基本是抄的

6. 用c语言编写扩展欧几里德算法用来求乘法逆元ab=1 mod(n) 要求我输入b,n,求出a。请编译运行通过,谢谢啦

这是一个错误的算法啊

7. 点的逆元怎么求

1、首先可以使用扩展欧几里得算法求点的逆元。
2、其次可以使用费马小定理或者欧拉定理求点的逆元。
3、最后可以使用递推求点的逆元。

8. 素数定理-欧几里得算法-乘法逆元

          素数定理给出的是估计素数个数的方法:

          设π(x)是小于x的素数的个数,则

          π(x)≈x/lnx

          eg:

               64位二进制表示的素数的个数为

              

     (1)欧拉定理

           提及欧拉定理,需要先引出欧拉函数的定义:

           欧拉函数Φ(n)是定义在正整数上的函数,Φ(n)的值等于序列0,1,2,3,…,n-1中与n互素的数的个数

           欧拉函数的性质:

                   (1)m的素数时,有Φ(m)=m-1

                   (2)m=pq,且p和q均是素数时,有Φ(m)=Φ(p)Φ(q)=(p-1)(q-1)

                   (3)若m和n互素,则Φ(m×n)=Φ(m)×Φ(n)

                   (4)若p是一个素数,则Φ(p^e)=p^e-p^(e-1)

                   (5)

         由欧拉函数可以延伸出欧拉定理的内容:

                    欧拉定理:

                              对于任何互素的两个整数a和n,有

                                        1(mod n) 

                              如果n=p是素数,则有

                                        1(mod p)

                             显然欧拉定理可以看成是费马定理的推广形式。

                    欧拉定理可以用来简化幂的模运算

                    Eg:

                           求 的后三位数字

                          解:     (mod 1000)的结果

                                 

                                       有 (mod 1000)

     (2)费马定理

           如果p是素数,a是正整数,且gcd(a,p)=1,那么

                   1(mod p)

          另一种形式:

               如果p是素数,a是任意正整数,则对gcd(a,p)=1,有

                   (mod p)

     (3)二次探测定理

          如果p是一个素数,且0<x<p,则方程 1(mod p)的解为 x = -1、p-1。

          即如果符合 1(mod p),那么p很有可能是素数,但是仍不能肯定p就是素数。

     (1)Wilson定理

          对于给定的正整数n,判断n是一个素数的充要条件是 -1(mod n)。

          虽然是充要条件,且Wilson的定理有很高的的理论介质。因为带有阶乘,在检测的时候计算量大,不适合检测较大素数的检测。

     (2)米勒-拉宾算法

          米勒-拉宾算法是一个多项式算法,能以接近概率1保证判断结果的正确性。

          Miller-Rabin(n)

          把n-1写成 ,其中m是一个奇数

          选取随机整数a,使得

               (mod n)

               If (mod n)

                    Return (‘n是素数’)

               End

               For i=0到k-1

                    If b≡-1(mod n)

                         Return (‘n是素数’)

                    Else

                         b=b^2(mod n)

                    End

               End

                    Return(‘n是合数’)

欧几里得算法描述:

          两个整数用a,b表示,商用q表示,余数用r表示

          Step1      取a,b较大者为a,较小者为b

          Step2      做除法,计算并保留余数r=mod(a,b)

          Step3      将原来的除数改做被除数,余数作为除数a=b,b=r

          重复Step1和Step2直到r=0,返回b

乘法逆元的定义:

          假设gcd(a,n)=1,则存在整数s,使得 (mod n),即s是a(mod n)的乘法逆元素。

     关于ax+by=d

          设a和b是两个正整数(至少有一个非零),d=gcd(a,b),则存在整数x和y使得ax+by=d成立,如果a、b互素,那 么存在整数x和y使得ax+by=1成立,此时可以求出ax≡1(mod b)中的x,即为逆元。

扩展欧几里得算法:

构造两个数列:

       

        Eg:

                 求28mod75的乘法逆元(a=75,b=28)

                      gcd(28,75)=1 所以存在逆元

                      75=2×28+19

                      28=1×19+9

                      19=2×9+1

                      9=9×1+0 

                      3×78+(-8)×28=1 

                      所以28mod75的乘法逆元为-8

    中国剩余定理完整版

           Eg:

                   已知下列同余方程组,求解x

                   第一步:求M

                         M=2×3×5×7=210

                   第二步:求

                       

                   第三步:求

                        1(mod )(i=1,2,...,k)

                   第四步:

                         (mod M)

                         (105×1×1+70×1×2+42×3×3+30×4×5)(mod 210)

                         173(mod 210)

9. 用C语言编制的求模逆元的扩展欧几里德算法,只要能基本上实现这个功能就行

  1. 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。

  2. 下面是一个使用C语言的实现:

    intexGcd(inta,intb,int&x,int&y)
    {
    if(b==0)//当b==0时,得到解
    {
    x=1;y=0;
    returna;
    }
    intr=exGcd(b,a%b,x,y);//递归调用自身,求解
    intt=x;x=y;y=t-a/b*y;
    returnr;
    }
阅读全文

与欧几里得算法求逆元相关的资料

热点内容
gcc编译vi文件 浏览:61
安卓连airpods怎么找耳机 浏览:925
加密货币转账教程 浏览:227
程序员小灰hashmap 浏览:836
国语pdf版 浏览:182
少儿编程作品美丽的小房子 浏览:970
服务器卡在网页上怎么办 浏览:54
用python自制编译器 浏览:951
android分享新浪微博客户端 浏览:26
系统中服务器在哪里下载地址 浏览:1001
新a4安卓手机怎么投屏 浏览:173
pdftoemf 浏览:886
java接口可以实现接口吗 浏览:59
vb编程10个随机函数 浏览:21
程序员个人简介100 浏览:772
土木工程师算法工程师 浏览:92
javaexcel导入oracle 浏览:880
如何设置异地服务器 浏览:882
为什么安卓手机蓝牙耳机不会弹窗 浏览:547
linuxf77编译器安装教程 浏览:949