我正在使用我更正的这个新的和改进的代码来解决我遇到的这个问题。
我正在使用模块化求幂来使用公式 [a^k mod n] 来获得我必须做的作业的答案,我需要分两步对其进行编码。
首先 int k 必须转换为二进制
表示 K 由 0 和 1 的列表组成。其次,必须进行模幂运算
使用 a
、n
和 K[]
作为参数..
早些时候我的代码不正确并且能够更正它。
我现在面临的问题是,当我用谷歌搜索 5^3 % 13
的模幂在线计算器时,它应该是 == 8
我从我的代码中得到的结果是 5。 我想了解代码中是否遗漏了一些小问题,或者我的数学有误?谢谢
#include <iostream>
#include <vector>
using namespace std;
vector <int> BinaryK(int k);
int ModularExpo(int a, vector <int> & k, int n);
int main()
{
int a = 0;
int k = 0;
int n = 0;
cout << "a^k % n" << endl;
cout << "a = ";
cin >> a;
cout << "k = ";
cin >> k;
cout << "n = ";
cin >> n;
vector<int> B = BinaryK(k);
int result = ModularExpo(a, B, n);
cout << "a ^ k mod n == " << result << endl;
return 0;
}
// c == b^e % m
vector<int> BinaryK(int k)
{
vector<int> K; //hint: make K a vector
int tmp = k;
while (tmp > 0)
{
K.push_back(tmp % 2); //hint: use pushback
tmp = tmp / 2;
}
return K;
}
int ModularExpo(int a, vector<int> & K, int n)
{
if (n == 1)
return 0;
int b = 1;
if (K.size() == 0)
return b;
int A = a;
if (K[0] == 1)
b = a;
for (int i = 1; i < K.size() - 1; i++)
{
A = A * A % n;
if (K[i] == 1)
b = A*b % n;
}
return (b);
}
最佳答案
改变这一行:
for (int i = 1; i < K.size(); i++) // K.size() not K.size()-1
关于C++:实现模幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663313/