费马定理

 费马小定理是数论中的一个重要定理,其内容为:

 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p)

### 费马定理的 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、付费专栏及课程。

余额充值