우선, "여기 내 코드가 무엇입니까?" 문제. 대신 그것은 "여기 내 코드입니다, 이것이 문제입니다. 배열의 어떤 부분을 잘못 이해 했습니까?" 나는 그 질문들 사이의 차이가이 게시물이 너무 많은 사람들을 괴롭히지 않을 것이라는 것을 의미한다고 기대하고있다. 나는 내 지식을 향상시켜 다른 사람들이 저를 위해 일하도록하지 않기를 희망합니다.C++의 배열에 대한 오해.
내가 가지고있는 문제는 배열 작동 방식에 대한 내 이해에서 근본적인 (잘하면 설명하기 쉬운) 문제 때문입니다. 나는 스스로 가르쳤고 내 질문은 너무 구체적이어서 Google의 도움을 찾을 수 없었습니다.
내가 빨리 내 코드의 각 부분이 케이스에 중요 않는다, 이것은 관련성이없는 경우 죄송합니다 (이 는 RSA 알고리즘의 암호화 부분으로를 가정입니다) 무엇을 설명 할 것이다 :
int returnVal (char x)
{
return (int) x - 87;
}
a = 10, b = 11, ... z = 35 인 문자를 숫자로 변환합니다.
unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
unsigned long long remainder;
int x = 1;
while (e != 0)
{
remainder = e % 2;
e= e/2;
if (remainder == 1)
x = (x * b) % m;
b= (b * b) % m;
}
return x;
}
본 항에있어서, 모듈러 지수화하고 단순화 내 고유 함수는 다음과^B (MOD N)는^C (MOD N을) = *는^D (MOD N) 여기서, C + D = 비. 큰 값을 빨리 사용할 수 있도록 허용하는 것입니다 (또한 부동 소수점 오류도 피할 수 있습니다). 이 함수는 자체적으로 잘 작동합니다 (많은 답변이 wolfram alpha를 사용하여 검사되었습니다). 그러나 배열과 결합 할 때 어떤 종류의 오류가있는 경우에 대비해 포함 시켰습니다.
내 문제가 있습니다 곳입니다int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)
{
std::cout << modExp (returnVal(s[i]), e, n);
}
}
, 나는 다음 RSA 알고리즘을 수행하는 "1011"형성 "AB"를 결합 배열을 사용하려합니다. 순간 은 10^7 MOD (10,403) =2,71711^7 MOD (10,403) =2,352을 수행하고 "27,172,352"의 출력을 제공한다. 내가 원하는 것은 1011^7 (mod 10403) = 2122을 수행하고이를 출력으로 제공하는 것입니다 (문제를 바로 건너 뛰는 사람들을 위해이 부분을 굵게 표시했습니다).
분명히 "ab"와 "1011"을 결합하는 배열을 사용하려는 나의 시도가 잘못되었습니다. 제 질문은 왜 그것이 잘못된 것입니까? 그것이 맞도록 그것을 적응시키는 방법이 있습니까? 번호를 함께 결합하기 위해 어떤 새로운 방법을 사용해야합니까?
질문이 길면 유감이지만 너무 모호한 것보다는 너무 구체적 일 것입니다. 의견을 보내 주셔서 감사합니다. 아래에 코드를 붙여서 한 곳에서 모두 정리할 것입니다. . 내가 제대로 이해하면
#include <iostream>
#include <sstream>
#include <string>
#include <math.h>
int returnVal (char x)
{
return (int) x - 87;
}
unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
unsigned long long remainder;
int x = 1;
while (e != 0)
{
remainder = e % 2;
e= e/2;
if (remainder == 1)
x = (x * b) % m;
b= (b * b) % m;
}
return x;
}
int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)
{
std::cout << modExp (returnVal(s[i]), e, n);
}
}
당신이 얻고있는 대답 (27172352)과 수행중인 작업 (mod 10403)에 대해 생각해보아야합니다. 대답은 0..10402 범위에 있어야하므로 분명히 답은 옳을 수 없습니다. –
배열과 관련한 * 아무것도 * 없습니다. 여기에 실제로 붙어있는 것은 16 진수 문자열을 디코딩하는 방법입니다. 당신은 그 것을 검색 할 수 있고 여기와 다른 곳에서 대답을 찾을 수 있습니다. 문자열의 각 문자에 대해'modExp()'를 한 번 호출하는 것에주의하십시오. 당신이 원하는 것은 문자열을 디코딩하고 결과에서'modExp'를 한 번 호출하는 것입니다. – TypeIA
예, 배열의 첫 번째 숫자에 대한 응답으로 ** 2717 **을, ** 2717 ** 2352에 두 번째 숫자로 2352를 제공합니다. 이것이 내 문제의 근본 원인입니다. – MichaelRad