2014-03-01 4 views
1

우선, "여기 내 코드가 무엇입니까?" 문제. 대신 그것은 "여기 내 코드입니다, 이것이 문제입니다. 배열의 어떤 부분을 잘못 이해 했습니까?" 나는 그 질문들 사이의 차이가이 게시물이 너무 많은 사람들을 괴롭히지 않을 것이라는 것을 의미한다고 기대하고있다. 나는 내 지식을 향상시켜 다른 사람들이 저를 위해 일하도록하지 않기를 희망합니다.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); 
    } 
} 
+0

당신이 얻고있는 대답 (27172352)과 수행중인 작업 (mod 10403)에 대해 생각해보아야합니다. 대답은 0..10402 범위에 있어야하므로 분명히 답은 옳을 수 없습니다. –

+2

배열과 관련한 * 아무것도 * 없습니다. 여기에 실제로 붙어있는 것은 16 진수 문자열을 디코딩하는 방법입니다. 당신은 그 것을 검색 할 수 있고 여기와 다른 곳에서 대답을 찾을 수 있습니다. 문자열의 각 문자에 대해'modExp()'를 한 번 호출하는 것에주의하십시오. 당신이 원하는 것은 문자열을 디코딩하고 결과에서'modExp'를 한 번 호출하는 것입니다. – TypeIA

+0

예, 배열의 첫 번째 숫자에 대한 응답으로 ** 2717 **을, ** 2717 ** 2352에 두 번째 숫자로 2352를 제공합니다. 이것이 내 문제의 근본 원인입니다. – MichaelRad

답변

0

(또한, 나는 서명되지 않은 긴만큼 일반적으로 p와 q를 사용하고 훨씬 더 큰 것) :

당신이해야 할 모든 동의 returnVal을 만드는 것입니다 중 하나 char * 또는 std::string 그리고 전체 문자열을 전달하십시오. 그런 다음 문자를 하나씩 변환 한 다음 (출력 변수에 100을 곱한 다음 10 진수로 고정하려는 경우) 정수 출력으로 추가해야합니다. 그러나, 그것은 방법으로 빨리 (비트 시프트 대 100 곱하기)되어야하므로 대신 헥스를 사용하는 것이 좋습니다거야.

편집 :

기능은 다음과 유사합니다 :

unsigned long long returnVal(char *str, size_t length){ 

    unsigned long long result = 0; 

    for(unsigned int i=0;i<length;++i){ 
     // Do stuff :D 
    } 

    return result; 

} 

값이 매우 빠르게 커질 것이기 때문에 내가 unsigned long long에 INT 변경. 실제 구현에서는 어쨌든 너무 작습니다.

+0

도움을 주셔서 감사합니다. 16 진법을 확실히 읽으 려합니다.'returnVal'을'char *'또는'std :: string'으로 받아들이려면 어떻게해야합니까? – MichaelRad

+0

인수를 변경 한 다음 모든 문자를 반복하여 하나씩 처리합니다. C 문자열 ('char *')을 사용하기로 결정했다면 ** length ** 인수를 전달해야합니다. – Kelm

+0

미안하지만, 나는 "mathsy"물건을 좋아하지만 용어로 정말 고심하고 있습니다. 어떤 부분이 논점이며 어떻게 변화시킬 것인가? 도움을 주셔서 감사합니다, 나는 내 어리 석음이 절망적이어야한다는 것을 알고 있습니다! – MichaelRad

0

"분명히"ab "와"1011 "을 결합하는 배열을 사용하려는 시도가 잘못되었습니다."

확실히, 문자열 배열의 각 요소는 별도의 문자 s [0] == 'a', s [1] == 'b'입니다. 배열 요소가 '결합'되는 방법은 없습니다.

당신은 너무로 두 자리 십진수를 결합 할 수 있습니다 :

int left = returnVal('a'); // decimal 10 
int right = returnVal('b'); // decimal 11 

int result = (left *= 100) + right; // 1000 + 11 = 1011 

참조 : Positional numeral system

P.S.을 RSA 구현에서 "ab"는 무엇을 의미합니까?

+0

환상적입니다. 고마워요! 이것은 2 글자보다 긴 것에 적용될 수 있습니까? 예 : "abc"또는 "word"로 변환 하시겠습니까? 그것은 어떤 형태의 루프가되어야하고 어떻게 그렇게 할 것인가? – MichaelRad

+0

"ab"는 메시지 또는 암호화 키를 단순화 한 것입니다. 날 잘못하면 정답 :) – Kelm

+0

"abc"를 십진수 101112로 변환 하시겠습니까? 마찬가지로, 10 * 10000 + 11 * 100 + 12의 큰 배율을 곱하여 여분의 왼쪽 십진수를 "이동"해야합니다.이 변환하지만 트랙 int 오버 플로우를 변환하는 함수를 만들 수 있습니다. 에 대해 읽어 보시기 바랍니다 [위치 표기 (http://en.wikipedia.org/wiki/Positional_notation) : 는 어쩌면 진수 사용 내장 된 바이너리 변화 << 조작으로 작업 더 좋을 것이다? –