费马小定理(介绍+证明+逆元代码实现)
Posted 地球太危险了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费马小定理(介绍+证明+逆元代码实现)相关的知识,希望对你有一定的参考价值。
目录
一、背景知识回顾
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
以上是关于费马小定理(介绍+证明+逆元代码实现)的主要内容,如果未能解决你的问题,请参考以下文章