设是奇素数,编程实现模的原根及构建指数表,并由此快速计算。c语言代码
时间: 2024-10-28 22:10:48 浏览: 24
C语言实现的Hash表(代码)
在C语言中,如果你想要找出给定的奇素数p的模p的原根(Primitive Root),以及构建指数表用于快速幂运算,你需要遵循一些数学原理并编写相应的函数。这里是一个简单的示例:
```c
#include <stdio.h>
#include <math.h>
// 判断是否为素数
int isPrime(int n) {
if (n <= 1)
return 0;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return 0;
}
return 1;
}
// 寻找模p的次方取模等于1的最小正整数g,即原根
int findPrimitiveRoot(int p) {
for (int g = 2; g < p; g++) {
if (gcd(g, p) == 1 && pow(g, p - 1) % p == 1) // gcd为欧几里得算法求最大公约数
return g;
}
return -1; // 如果找不到原根,返回-1
}
// 计算a^b mod p
long long fastPower(long long a, int b, int p) {
long long res = 1;
while (b > 0) {
if (b & 1)
res = (res * a) % p;
a = (a * a) % p; // 使用了指数表的思想
b >>= 1;
}
return res;
}
// 构建指数表
void buildExponentTable(int p, int primitiveRoot, long long table[p]) {
for (int i = 0; i < p - 1; i++)
table[i] = fastPower(primitiveRoot, i, p);
}
int main() {
int p;
printf("Enter an odd prime number: ");
scanf("%d", &p);
if (!isPrime(p)) {
printf("Not a prime number.\n");
return 1;
}
int g = findPrimitiveRoot(p);
if (g == -1) {
printf("Could not find primitive root.\n");
} else {
printf("Primitive root modulo %d is: %d\n", p, g);
long long exponentTable[p];
buildExponentTable(p, g, exponentTable);
printf("Exponent table: \n");
for (int i = 0; i < p - 1; i++) {
printf("%d^%d mod %d = %lld\n", g, i, p, exponentTable[i]);
}
}
return 0;
}
```
这段代码首先检查输入的数是否为素数,然后寻找原根,接着构建指数表。你可以使用这个代码作为起点,根据需要修改它或者扩展功能。
阅读全文