费马小定理(介绍+证明+逆元代码实现)

Posted 地球太危险了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费马小定理(介绍+证明+逆元代码实现)相关的知识,希望对你有一定的参考价值。

目录

一、背景知识回顾

1、什么是质数?

2、≡的意思?

3、mod的意思?

4、数论中的倒数(也成为逆元)

二、什么是费马小定理?

三、费马小定理历史

四、费马小定理证明

五、应用

六、求逆元的代码实现


一、背景知识回顾

1、什么是质数?

质数(prime number)又称素数,有无限个。

质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数

2、≡的意思?

≡   的意思是左右两边的数对p求模结果相同。

3、mod的意思?

指求模运算。

4、数论中的倒数(也成为逆元)

我们知道:如果a*x = 1,那么x是a的倒数,x = 1/a,但是a如果不是1,那么x就是小数。

那么在数论中,大部分情况下都有求余,所以现在问题变了

现在有:a*x  ≡ 1 (mod p)

那么x一定等于1/a吗?

不一定

那么在这个时候,我们就把x看成a的倒数,只不过加了一个求余条件,所以x叫做a关于p的逆元。

二、什么是费马小定理?

       费马小定理是数论中的一个定理。其内容为假如a是一个整数,p是一个质数的话,那么:

  ap = a(mod p)

  假如a不是p的倍数的话,那么这个定理也可以写成:

  ap − 1 = 1(mod p)

  这个书写方式更加常用些。

三、费马小定理历史

  皮埃尔·德·费马于1636年发现了这个定理,在一封1640年10月18日的信中他第一次使用了上面的书写方式。在他的信中费马还提出a是一个质数的要求。这个要求实际上不存在。

四、费马小定理证明

 任意取一个质数,比如13。考虑从1到12的一系列整数1,2,3,4,5,6,7,8,9,10,11,12,给这些数都乘上一个与13互质的数,比如3,得到3,6,9,12,15,18,21,24,27,30,33,36。对于模13来说,这些数同余于3,6,9,12,2,5,8,11,1,4,7,10。这些余数实际上就是原来的1,2,3,4,5,6,7,8,9,10,11,12,只是顺序不同而已。

  把1,2,3,„,12统统乘起来,乘积就是12的阶乘12!。把3,6,9,„,36也统统乘起来,并且提出公因子3,乘积就是312×12!。对于模13来说,这两个乘积都同余于1,2,3,„,12系列,尽管顺序不是一一对应,即312×12!≡12!mod 13。两边同时除以12!得312≡1 mod 13。如果用p代替13,用x代替3,就得到费马小定理。

证明来自:《数论妙趣——数学女王的盛情款待》第六章 开门咒

五、应用

费马小定理可以快速求得x关于p的逆元(参看上面逆元的概念)。

前提当然得是x与p互质才有逆元。

即:x*x^p-2  ≡ 1 (mod p)

所以x^p-2就是x关于p的逆元。

六、求逆元的代码实现

这里使用了快速幂算法来求x^p-2。

#include<iostream>
#define ll long long
using namespace std;
ll quickpow(ll a, ll b, ll p)
    ll temp = 1;
    while(b)
        if(b & 1) temp = (temp * a) % p;
        a = (a * a) % p;
        b >>= 1;
    
    return temp;

int main()

	ll a, p;
	cin>>a>>p;
	cout<<quickpow(a, p-2, p)<<endl;
	return 0;

参考博客:

1、逆元的概念与逆元的计算:https://www.cnblogs.com/linyujun/p/5194184.html

2、费马小定理证明:https://www.cnblogs.com/flipped/p/5218037.html

3、快速幂算法:https://blog.csdn.net/weixin_42151279/article/details/81057137

以上是关于费马小定理(介绍+证明+逆元代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

数论 逆元求解(扩展欧几里得算法+费马小定理)

费马小定理&欧拉定理

浅谈欧拉定理及乘法逆元

逆元初步

《夜深人静写算法》数论篇 - (16) 费马小定理

夜深人静写算法(三十二)- 费马小定理