2012-03-11 4 views
4

저는 암호화 작업을하고 있으며 실제로 큰 숫자를 사용해야합니다. 또한 부동 소수점 데이터를 인수로 취하는 함수를로드하여 수행되는 m128i 데이터 형식이 필요한 carryless 곱셈에 대한 새로운 Intel 명령어를 사용하고 있습니다.C의 사용자 정의 데이터 유형

2^1223 정수를 저장 한 다음이를 사각형으로 저장해야합니다.

GMP 라이브러리를 사용할 수는 있지만 2^1224와 2^2448 같은 값을 저장하는 두 가지 데이터 형식을 만드는 것이 더 빠를 것이라고 생각합니다. 그것은 오버 헤드가 적을 것입니다. 저는 karatsuba를 사용하여 숫자를 곱하려고하므로 데이터 유형에 대해 수행해야하는 유일한 연산은 m128i에 맞게 숫자를 나누기위한 것입니다.

내가 필요한 정수 크기를 만드는 데 도움이되는 자료로 방향을 안내 할 수 있습니까?

+4

자신이 작성한 코드가 이미 고도로 최적화 된 (디버깅 된) 코드보다 빠르다고 생각합니까? (비록 당신이 관심을 가지고 있다면, 당신은 그랬던 것처럼 계속하십시오 :)) – huon

답변

4

(수학 여부와 상관없이) 자신 만의 데이터 유형이 필요한 경우 구조와 함수로 폴백해야합니다. 예를 들어 다음

typedef struct bignum_s bignum; 

과 :

struct bignum_s { 
    char bignum_data[1024]; 
} 

대부분의 사람들은뿐만 아니라 그것을 typedefing 결국 (분명히 당신이 크기 조정 권한을 얻으려면, 이것은 단지 예입니다) 두 가지 (또는 무엇이든) 포인터를 사용하여 원하는대로 할 수 있습니다.

/* takes two bignums and ORs them together, putting the result back into a */ 
void 
bignum_or(bignum *a, bignum *b) { 
    int i; 
    for(i = 0; i < sizeof(a->bignum_data); i++) { 
     a->bignum_data[i] |= b->bignum_data[i]; 
    } 
} 

거의 모든 기능을 정의해야하는데, 메모리 할당 기능 (bignum_new), 메모리 해제 기능 (bignum_free) 및 초기화 루틴 (bignum_init)이 자주 포함됩니다. 지금 필요하지 않더라도 사전에 코드를 작성하면 나중에 코드가 커지고 나중에 개발되어야 할 때를 대비할 수 있습니다.

+1

주 : 예제 또는 함수는 값에 의한 전달로 인해 깨졌습니다. 호출자의 'a'는 변경되지 않습니다. – unwind

+0

이 포인터로 변경되었습니다. 감사! –