数学(1.费马定理 2.扩展欧几里德算法 3.莫比乌斯反演)

本文介绍了数论中的费马小定理及其应用,并详细阐述了扩展欧几里德算法的工作原理及其实现过程,用于解决模线性方程等问题。

费马小定理(Fermat Theory)数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1) ≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

 

 

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

欧几里德算法的扩展
扩展欧几里德算法不但能计算(a,b)的 最大公约数,而且能计算a模b及b模a的 乘法逆元,用C语言描述如下:
 1 int gcd(int a,int b,int &ar,int &br)
 2 {
 3     int x1,x2,x3;
 4     int y1,y2,y3;
 5     int t1,t2,t3;
 6     if(0==a)//有一个数为0,就不存在乘法逆元
 7     {
 8         ar=0;br=0;
 9         return b;
10     }
11     if(0==b)
12     {
13         ar=0;br=0;
14         return a;
15     }
16     x1=1;x2=0;x3=a;
17     y1=0;y2=1;y3=b;
18     int nk;
19     for(t3=x3%y3;t3!=0;t3=x3%y3)
20     {
21         k=x3/y3;
22         t2=x2-k*y2;t1=x1-k*y1;
23         x1=y1;x2=y2;x3=y3;
24         y1=t1;y2=t2;y3=t3;
25     }
26     if(y3==1)//有乘法逆元
27     {
28         ar=y2;
29         br=x1;
30         return 1;
31     }
32     else//公约数不为1,无乘法逆元
33     {
34         ar=0;
35         br=0;
36         return y3;
37     }
38 }

 

 

000

转载于:https://www.cnblogs.com/henserlinda/p/4729217.html

### 费马小定理C++ 实现方法 费马小定理是数论中的一个重要定理,它表明:如果 $ p $ 是一个质数,且 $ a $ 与 $ p $ 互质,则有: $$ a^{p-1} \equiv 1 \ (\text{mod} \ p) $$ 基于这一性质,可以实现多种算法,包括求解模逆元、素性检测等。以下将分别介绍这些应用场景的 C++ 实现。 --- #### 求模逆元 在模 $ p $ 的情况下,如果 $ p $ 是质数,且 $ a $ 与 $ p $ 互质,则 $ a $ 的模逆元可以通过 $ a^{p-2} \mod p $ 得到。可以使用快速幂算法实现这一过程。 ```cpp #include <bits/stdc++.h> using namespace std; int quick_pow(int a, int b, int mod) { int res = 1; while (b) { if (b & 1) { res = 1LL * res * a % mod; } a = 1LL * a * a % mod; b >>= 1; } return res; } int main() { int a, p; cin >> a >> p; if (a % p != 0) { cout << "a的模逆元为: " << quick_pow(a, p - 2, p) << endl; } else { cout << "a与p不互质,无法求模逆元" << endl; } return 0; } ``` --- #### 费马小定理进行素性检测 费马小定理可以用于素性检测。对于一个奇数 $ n $,随机选择一个底数 $ a $,若 $ a^{n-1} \mod n \neq 1 $,则 $ n $ 是合数;否则,可能是素数。通过多次检测可以提高准确性。 ```cpp #include <bits/stdc++.h> using namespace std; int quick_pow(int a, int b, int mod) { int res = 1; while (b) { if (b & 1) { res = 1LL * res * a % mod; } a = 1LL * a * a % mod; b >>= 1; } return res; } bool is_prime(int n, int k) { if (n <= 1) return false; if (n <= 3) return true; for (int i = 0; i < k; ++i) { int a = 2 + rand() % (n - 3); if (quick_pow(a, n - 1, n) != 1) { return false; } } return true; } int main() { srand(time(0)); int n, t; cout << "请输入要检测的数n: "; cin >> n; cout << "请输入检测次数t: "; cin >> t; if (is_prime(n, t)) { cout << n << " 可能是素数" << endl; } else { cout << n << " 是合数" << endl; } return 0; } ``` --- #### 费马数生成与检测 费马数定义为 $ F_n = 2^{2^n} + 1 $,可以用于生成特定形式的素数。通过判断费马数是否为素数,可以验证其性质。 ```cpp #include <iostream> #include <cmath> using namespace std; bool is_prime(long long n) { if (n <= 1) return false; for (long long i = 2; i * i <= n; ++i) { if (n % i == 0) return false; } return true; } int main() { for (int n = 0;; ++n) { long long exponent = pow(2, n); long long fermat_number = (1LL << exponent) + 1; if (is_prime(fermat_number)) { cout << "Fermat数 F_" << n << " = " << fermat_number << " 是素数" << endl; } else { cout << "Fermat数 F_" << n << " = " << fermat_number << " 不是素数" << endl; break; } } return 0; } ``` --- ### 总结 以上代码分别实现了费马小定理在 **模逆元计算**、**素性检测** 和 **费马数生成与检测** 中的应用。通过快速幂算法,可以高效地完成大指数的模幂运算,从而支持这些算法的实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值