나는 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);
}
무엇이 문제입니까? –
'free()'사용을 고려할 수도 있습니다. – cdarke
질문은 내가 어떻게 int 함수를 만들 수 있습니까? mpz_t 값을 반환합니까? –