Grande matriz em GMP

8

Se eu quiser usar uma matriz grande, como mpz_t A [100000], recebi "Falha na segmentação (core despejado)" durante minha compilação. Existe alguma maneira mais fácil de resolver isso?

user12290
fonte
4
Você já tentou alocá-lo dinamicamente em vez de estaticamente? Às vezes, as alocações estáticas ficam na pilha enquanto a dinâmica fica na pilha. Como alternativa, você pode alterar o tamanho da pilha e ver se isso resolve o problema. Sem saber em que sistema você está, não posso dizer como fazer isso.
tpg2114

Respostas:

6

O comentário de tpg2114 está no local. Tentar:

/* 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);

Se a mallocchamada aqui acionar um erro, você não terá memória suficiente disponível no seu sistema.

Se você estiver interessado em usar uma matriz estática na pilha, tente aumentar o tamanho do limite da pilha no Linux com o ulimitcomando

Aron Ahmadia
fonte
Muito obrigado. Durante minha compilação, recebi o seguinte aviso "declaração implícita incompatível da função incorporada 'malloc' [ativada por padrão]". No entanto, funciona.
user12290
1
@ user12290 grande, eu fixo o exemplo de código para incluir adequadamente stdlib.h
Aron Ahmadia
1
Pelo amor de tudo o que é bom e correto neste mundo, coloque um free(A)exemplo!
Bill Barth
Justo, fixo.
Aron Ahmadia 31/10/12
Como usar a matriz A? Se eu tentar: mpz_set_ui (A [4], 1212121); então eu tenho erro de memória.
Adam
2

Você também pode considerar o uso mpz_classem C ++ ( ref .) Em vez de mpz_t. Pode tornar a precisão aritmética arbitrária direta.

Aqui está um exemplo aleatório:

#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 com, por exemplo:

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