编写程序完成计算:1615mod 4371快速幂算法
时间: 2023-12-02 08:28:23 浏览: 38
好的,根据您的要求,我不会透露您的任何要求,也不会重复您说的话。关于您的问题,1615mod 4371的快速幂算法如下:
1. 将1615表示为二进制,即:1615 = 101000000111₂
2. 计算2的0次方到2的10次方的所有结果:2¹ = 2,2² = 4,2⁴ = 16,2⁸ = 256,2¹⁰ = 1024
3. 根据二进制数101000000111₂的每一位,计算出对应的乘积,即:2¹ × 2³ × 2⁵ × 2⁶ × 2⁷ × 2⁹ × 2¹⁰ × 2⁰ = 2⁻⁹ × 2¹⁰ × 2³⁵
4. 对乘积取模,即:2⁻⁹ × 2¹⁰ × 2³⁵ mod 4371
5. 使用扩展欧几里得算法求出乘法逆元,即:2⁹⁷⁶ mod 4371 = 3711
6. 将第4步的结果与乘法逆元相乘,并再次取模,即:(2⁻⁹ × 2¹⁰ × 2³⁵ × 3711) mod 4371 = 3051
因此,1615mod 4371的结果为3051。
相关问题
用c语言程序写(1) 编程实现模n的大数幂乘的快速算法,随机输入3个较大的数x, e, n,输出计算x的e次方 mod n (2) 编程实现模n求逆的算法,计算私钥。 (3) 编写RSA解密程序,完成文件data.txt中内容的解密,以字符形式输出明文。已知系统公开参数为n=18923, e=1261。并且给出实验过程和实验心得
(1)模n的大数幂乘的快速算法的实现:
```c
#include <stdio.h>
// 模n的大数幂乘的快速算法
long long fastPowMod(long long x, long long e, long long n) {
long long res = 1;
while (e > 0) {
if (e & 1) {
res = (res * x) % n;
}
x = (x * x) % n;
e >>= 1;
}
return res;
}
int main() {
long long x, e, n;
printf("请输入x, e, n:");
scanf("%lld%lld%lld", &x, &e, &n);
printf("x的e次方mod n = %lld\n", fastPowMod(x, e, n));
return 0;
}
```
(2)模n求逆的算法的实现:
```c
#include <stdio.h>
// 扩展欧几里得算法
void extendedEuclid(long long a, long long b, long long *x, long long *y) {
if (b == 0) {
*x = 1;
*y = 0;
return;
}
long long x1, y1;
extendedEuclid(b, a % b, &x1, &y1);
*x = y1;
*y = x1 - (a / b) * y1;
}
// 求模n的逆元
long long modInverse(long long a, long long n) {
long long x, y;
extendedEuclid(a, n, &x, &y);
return (x % n + n) % n;
}
int main() {
long long a, n;
printf("请输入a和n:");
scanf("%lld%lld", &a, &n);
long long aInverse = modInverse(a, n);
printf("a关于模n的逆元为:%lld\n", aInverse);
return 0;
}
```
(3)RSA解密程序的实现:
```c
#include <stdio.h>
// 模n的大数幂乘的快速算法
long long fastPowMod(long long x, long long e, long long n) {
long long res = 1;
while (e > 0) {
if (e & 1) {
res = (res * x) % n;
}
x = (x * x) % n;
e >>= 1;
}
return res;
}
int main() {
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return -1;
}
char c;
long long cipher = 0;
while ((c = fgetc(fp)) != EOF) {
cipher = cipher * 10 + (c - '0');
}
fclose(fp);
long long n = 18923, e = 1261;
long long d = 0; // 私钥
for (int i = 1; i < n; i++) {
if ((e * i) % (n - 1) == 1) {
d = i;
break;
}
}
long long plain = fastPowMod(cipher, d, n); // 解密
printf("解密后的明文为:%lld\n", plain);
return 0;
}
```
实验心得:在本次实验中,我通过编写 C 语言程序实现了模 n 的大数幂乘的快速算法、模 n 求逆的算法和 RSA 解密程序。通过这些实验,我更深入地了解了 RSA 加密算法的原理和实现方法,也锻炼了我的编程能力。
编写一个程序,随机选择3个较大的数x,e,n,计算x的e次方modn,
以下是Python代码实现:
```python
import random
def mod_exp(x, e, n):
# 计算x的e次方模n
result = 1
while e > 0:
if e % 2 == 1:
result = (result * x) % n
x = (x * x) % n
e //= 2
return result
# 随机生成3个较大的数
x = random.randint(100000000, 1000000000)
e = random.randint(100000000, 1000000000)
n = random.randint(100000000, 1000000000)
# 计算x的e次方模n
result = mod_exp(x, e, n)
print(f"{x}的{e}次方模{n}的结果为:{result}")
```
这个程序使用了一个名为`mod_exp`的函数,它采用了快速幂算法来计算x的e次方模n。在主程序中,我们使用Python的`random`模块来随机生成3个较大的数x、e和n,然后调用`mod_exp`函数来计算x的e次方模n的结果。
相关推荐
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![apk](https://img-home.csdnimg.cn/images/20210720083646.png)