费马小定理求素数

/*---------------------------------------------------
费马小定理:如果n是一个素数,a是小于n的任意正整数,那么a的n次方与a模n同余。
(俩个数称为模n同余,如果它们除以n的余数相同。数a除以n的余数称为a取模n的余数,或简称为a取模n)

condition:
   n is a prime
   a < n

result:
   a^n%n == a%n
---------------------------------------------------*/

int square(int n)
{
 return n*n;
}

/*---------------------------------------------------

计算一个数的幂对另一个数取模的结果,
确定是否素数所需的步数将具有θ(log n)的增长阶

---------------------------------------------------*/
int expmod(int base, int exp, int m)
{
 if (0 == base)
 {
  return 1;
 }
 else if (0 == exp%2) /*exp is even*/
 {
  return square( expmod(base, exp/2, m) ) % m;
 }
 else
 {
  return (base * expmod(base, exp-1, m)) %m;
 }
}

/*---------------------------------------------------

执行费马检查需要选取位于1和n-1之间(包含这两者)的数a,而后检查a的n次幂取模n的余数是否等于a.

---------------------------------------------------*/
bool fermat_test(int n)
{
 int a = rand() % n; /*a random int, less than n*/

 if( a == expmod(a, n, n) )
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}

 

bool fermat_prime(int n, int times)
{
 if (0 == times)
 {
  return TRUE;
 }
 else if( fermat_test(n) )
 {
  return fermat_prime(n, times-1);
 }
 else
 {
  return FALSE;
 }
}

 

int _tmain(int argc, _TCHAR* argv[])
{
 bool b = is_prime(17);
 b = is_prime(88);

 b = fermat_prime(31, 5);
 return 0;
}

### 使用费马小定理计算模逆元 #### 方法概述 当给定两个正整数 \( b \) \( m \),其中 \( b \) \( m \) 互质,且 \( m \) 是一个素数时,可以通过费马小定理来高效地计算 \( b \) 关于模 \( m \) 的乘法逆元。根据费马小定理[^2],\( b^{m-1} \equiv 1 \pmod{m} \) 成立。因此,我们可以得出: \[ b \cdot b^{m-2} \equiv 1 \pmod{m}. \] 这意味着 \( b^{m-2} \mod m \) 即为 \( b \) 对模 \( m \) 的乘法逆元。 --- #### 实现过程 以下是基于快速幂算法的 Python 实现代码,用于计算 \( b \) 关于模 \( m \) 的乘法逆元: ```python def fast_pow(base, exp, mod): result = 1 base %= mod # 确保基础取模 while exp > 0: if exp & 1: # 如果指数当前位为1 result = (result * base) % mod base = (base * base) % mod # 幂平方 exp >>= 1 # 右移一位 return result def modular_inverse(b, m): """ 计算 b 关于模 m 的乘法逆元。 :param b: 基础值 :param m: 模数(需为素数) :return: 返回 b 的乘法逆元 """ if gcd(b, m) != 1: # 验证 b m 是否互质 raise ValueError("b m 不互质,无法找到乘法逆元") return fast_pow(b, m - 2, m) from math import gcd # 测试用例 if __name__ == "__main__": b = 7 m = 13 inverse = modular_inverse(b, m) print(f"{b} 关于模 {m} 的乘法逆元是: {inverse}") ``` 上述代码中,`fast_pow` 函数实现了快速幂运算,而 `modular_inverse` 函数利用费马小定理计算乘法逆元。注意,在调用前应验证 \( b \) \( m \) 是否互质;如果不互质,则不存在乘法逆元。 --- #### 数学解释 通过费马小定理可知,若 \( b \) \( m \) 互质且 \( m \) 为素数,则有: \[ b^{m-1} \equiv 1 \pmod{m}, \] 将其改写为: \[ b \cdot b^{m-2} \equiv 1 \pmod{m}. \] 由此可得 \( b^{m-2} \mod m \) 即为所的乘法逆元。 --- #### 时间复杂度分析 由于采用了快速幂算法,时间复杂度为 \( O(\log(m)) \)[^4],这使其非常适用于大规模数据处理场景。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值