2017-10-06 26 views
1

나는 C가 처리 할 수있는 것보다 더 큰 숫자를 반환하는 코드에 문제가 있습니다. GMP 라이브러리를 설치했지만 인터넷에서 찾은 모든 자습서를 사용하여 제대로 작동하지 않는 것처럼 보입니다. 다음은 GMP 라이브러리의 기능을 사용한 코드입니다. 현재,이 사이트에서 매뉴얼을 읽음으로써 작동시키려는 메신저 : https://gmplib.org/manual/ 프로그램이 단순히 충돌합니다. Int 함수에서 mpz_t 정수를 반환하기 때문입니다. 어떻게 해결할 수 있을까요?C에서 큰 숫자를 GMP와 함께 사용

EDIT : Antoine이 말한 코드를 편집했는데 오류가 발생하지 않았지만 프로그램을 실행할 때 프로그램이 중단됩니다.

#include <stdio.h> 
#include <time.h> 
#include <math.h> 
#include <gmp.h> 

typedef struct Vector{ 
int *v; 
}vetor; 

int nextPow2(int n); 
int Multiplicacao(mpz_t r, int *x, int *y, int n); 

int main(){ 

int n = 100; 
vetor *x = malloc(sizeof(vetor)); 
vetor *y = malloc(sizeof(vetor)); 

srand((unsigned)time(NULL)); 
int i; 

int c = 0; 
i=0; 
c = nextPow2(n); 

x->v = malloc(sizeof(int)*c); 
y->v = malloc(sizeof(int)*c); 

for(i=0; i<c; i++){ 
    x->v[i] = 0; 
    y->v[i] = 0; 
} 

int d = c-n; 
i = c; 
while(i>=d){ 
    x->v[i] = rand()%2; 
    y->v[i] = rand()%2; 
    i--; 
} 

printf("\n Vetor X\n"); 

for(i=0; i<c; i++){ 
    printf("%i", x->v[i]); 
} 

printf("\n Vetor Y\n"); 

for(i=0; i<c; i++){ 
    printf("%i", y->v[i]); 
} 

mpz_t r; 
mpz_inits(r); 

mpz_set(r, Multiplicacao(r, x->v, y->v, c)); 

printf("\n\n RESULTADO \n\n"); 
gmp_printf ("%Zd\n", r); 
mpz_clear(r); 

return 0; 
} 

int Multiplicacao(mpz_t r, int *x, int *y, int n){ 
if(n==1) 
    return x[0]*y[0]; 
else{ 
    vetor *Xe = malloc(sizeof(vetor)); 
    vetor *Xd = malloc(sizeof(vetor)); 
    vetor *Ye = malloc(sizeof(vetor)); 
    vetor *Yd = malloc(sizeof(vetor)); 
    int j; 
    Xe->v = malloc(sizeof(int)*n/2); 
    Xd->v = malloc(sizeof(int)*n/2); 
    Ye->v = malloc(sizeof(int)*n/2); 
    Yd->v = malloc(sizeof(int)*n/2); 

    for(j=0; j<n/2; j++){ 
     Xe->v[j]=x[j]; 
     Ye->v[j]=y[j]; 
    } 
    int k=0; 
    for(j=n/2; j<n; j++){ 
     Xd->v[k]=x[j]; 
     Yd->v[k]=y[j]; 
     k++; 
    } 

    mpz_t p1, p2, p3, p4, a, b; 
    mpz_inits(p1, p2, p3, p4, a, b); 

    mpz_ui_pow_ui(a, 2, n); 
    mpz_ui_pow_ui(b, 2, n/2); 


    mpz_set(p1, Multiplicacao(r, Xe->v, Ye->v, n/2)); 
    mpz_set(p2, Multiplicacao(r, Xe->v, Yd->v, n/2)); 
    mpz_set(p3, Multiplicacao(r, Xd->v, Ye->v, n/2)); 
    mpz_set(p4, Multiplicacao(r, Xd->v, Yd->v, n/2)); 

    mpz_mul(p1, p1, a); 
    mpz_mul(p2, p2, b); 
    mpz_mul(p3, p3, b); 

    mpz_add(p1, p1, p2); 
    mpz_add(p3, p3, p4); 
    mpz_add(p1, p1, p3); 

    return p1; 
} 
} 

int nextPow2(int n) 
{ 
if (n <= 1) return n; 
double d = n-1; 
return 1 << ((((int*)&d)[1]>>20)-1022); 
} 
+1

무엇이 문제입니까? –

+0

'free()'사용을 고려할 수도 있습니다. – cdarke

+0

질문은 내가 어떻게 int 함수를 만들 수 있습니까? mpz_t 값을 반환합니까? –

답변

1

mpz_t을 반환하는 것은 바람직하지 않습니다.

void func (mpz_t result, ...) 
{ 
    ... 
    mpz_set (result, ...); 
} 

과 같이 호출 : 그렇다 경고에이 턴에서

mpz_t result; 
mpz_init (result); 

func (result, ...); 
gmp_printf ("%Zd\n", result); 

mpz_clear (result); 

와 GMP 설명서를 읽어 결과가 저장 될 위치를 당신은 당신의 함수는 첫 번째 인수로 mpz_t을 가져야한다 면밀히. 모든 기능 을 읽어야합니다. 함수 서명에 특히주의하십시오. 예를 들어 mpz_pow_ui 대신 mpz_ui_pow_ui을 사용해야합니다. 실제로 코드에서 GMP 함수를 사용할 때마다 틀립니다.

+0

나는 그것을 시험해 볼 것이다. 감사 –