Gran variedad en GMP

8

Si quiero usar una matriz grande, digamos mpz_t A [100000], recibí "Error de segmentación (núcleo volcado)" durante mi compilación. ¿Hay alguna manera más fácil de resolver esto?

usuario12290
fuente
44
¿Has intentado asignarlo dinámicamente en lugar de estáticamente? A veces, las asignaciones estáticas van en la pila mientras que las dinámicas van en el montón. Alternativamente, puede cambiar el tamaño de su pila y ver si eso soluciona el problema. Sin saber en qué sistema estás, no puedo decirte cómo hacerlo.
tpg2114

Respuestas:

6

El comentario de tpg2114 es perfecto. Tratar:

/* at top */
#include <stdlib.h>

/* definition */
mpz_t *A;

/* initialization of A */
A = (mpz_t *) malloc(100000 * sizeof(mpz_t));
if (NULL == A) {
    printf("ERROR: Out of memory\n");
    return 1;
}

/* no longer need A */
free(A);

Si la mallocllamada aquí desencadena un error, no tiene suficiente memoria disponible en su sistema.

Si está interesado en usar una matriz estática en la pila, puede intentar aumentar el tamaño límite de la pila en Linux con el ulimitcomando.

Aron Ahmadia
fuente
Muchas gracias. Durante mi compilación recibí la siguiente advertencia "declaración implícita incompatible de la función incorporada 'malloc' [habilitada por defecto]". Sin embargo funciona.
usuario12290
1
@ user12290 genial, he arreglado la muestra de código para incluir correctamente stdlib.h
Aron Ahmadia
1
Por amor a todo lo que es bueno y correcto en este mundo, ¡pon un free(A)ejemplo!
Bill Barth
Bastante justo, arreglado.
Aron Ahmadia
¿Cómo usar la matriz A? Si lo intento: mpz_set_ui (A [4], 1212121); entonces recibí un error de memoria.
Adam
2

También puede considerar usar mpz_classen C ++ ( ref .) En lugar de mpz_t. Puede hacer aritmética de precisión arbitraria directa.

Aquí hay un ejemplo al azar:

#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
using namespace std;

int main() {
  mpz_class A[100000];
  for(int i=0;i<100000;i++) A[i]=142412+i;

  for(int i=0;i<100000;i++) cout << i << " " << A[i] << endl;

  return 0;
}

Compilado con, por ejemplo:

g++ [[filename]] -lgmp -lgmpxx
Douglas S. Stones
fuente