2014-10-23 8 views
0

나는 많은 수의 사용 C에서 다음 (의사 코드 - 파이썬)를 구현하기 위해 노력하고있어 사용 "중단됨"프로그램 : 나는 다음과 같은 사용 내놓았다GNU MP "많은 수의"라이브러리

while i * i < n: 
    if n % i: 
    i += 1 

gmp.h 라이브러리 : 나는 GCC로 컴파일 그런데 프로그램을 실행하려고 할 때 다음과 같은 Aborted을 얻을 때

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

int main() { 
    mpz_t n; 
    mpz_t i; 
    mpz_t o; // Hold constant mpz "1" for incrementing i 
    mpz_t x; // Holds "i * i" each loop 

    mpz_set_str(n, "338852330881981183", 10); 
    mpz_set_str(i, "2", 10); 
    mpz_set_str(o, "1", 10); 
    mpz_set_str(x, "4", 10); 


    while(mpz_cmp(x, n) < 0) { 
     mpz_add(i, i, o); 
     mpz_pow_ui(x, i, 2); 
    } 

    mpz_clear(i); 
    mpz_clear(n); 
    return 0; 
} 

나는 오류를하지 않습니다. 나는 전에 이것을 보지 못했고 C로 많이 프로그래밍하지 않고 gmp.h과 매우 큰 숫자를 사용했다.

*** glibc detected *** ./factor: realloc(): invalid old size: 0x00000000004006d0 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x76d76)[0x7fdc1eb7bd76] 
/lib/x86_64-linux-gnu/libc.so.6(+0x7c94c)[0x7fdc1eb8194c] 
/lib/x86_64-linux-gnu/libc.so.6(realloc+0xf0)[0x7fdc1eb81c60] 
/usr/lib/x86_64-linux-gnu/libgmp.so.10(__gmp_default_reallocate+0x1c)[0x7fdc1ee98a1c] 
/usr/lib/x86_64-linux-gnu/libgmp.so.10(__gmpz_realloc+0x3a)[0x7fdc1eeaebba] 
/usr/lib/x86_64-linux-gnu/libgmp.so.10(__gmpz_set_str+0x301)[0x7fdc1eeafef1] 
./factor[0x400810] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7fdc1eb23ead] 
./factor[0x4006f9] 
======= Memory map: ======== 
00400000-00401000 r-xp 00000000 08:01 1723311       /root/Desktop/factor 
00600000-00601000 rw-p 00000000 08:01 1723311       /root/Desktop/factor 
01629000-0164a000 rw-p 00000000 00:00 0         [heap] 
7fdc18000000-7fdc18021000 rw-p 00000000 00:00 0 
7fdc18021000-7fdc1c000000 ---p 00000000 00:00 0 
7fdc1e8ef000-7fdc1e904000 r-xp 00000000 08:01 1445725     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdc1e904000-7fdc1eb04000 ---p 00015000 08:01 1445725     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdc1eb04000-7fdc1eb05000 rw-p 00015000 08:01 1445725     /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fdc1eb05000-7fdc1ec85000 r-xp 00000000 08:01 1445701     /lib/x86_64-linux-gnu/libc-2.13.so 
7fdc1ec85000-7fdc1ee85000 ---p 00180000 08:01 1445701     /lib/x86_64-linux-gnu/libc-2.13.so 
7fdc1ee85000-7fdc1ee89000 r--p 00180000 08:01 1445701     /lib/x86_64-linux-gnu/libc-2.13.so 
7fdc1ee89000-7fdc1ee8a000 rw-p 00184000 08:01 1445701     /lib/x86_64-linux-gnu/libc-2.13.so 
7fdc1ee8a000-7fdc1ee8f000 rw-p 00000000 00:00 0 
7fdc1ee8f000-7fdc1eef6000 r-xp 00000000 08:01 2240985     /usr/lib/x86_64-linux-gnu/libgmp.so.10.0.5 
7fdc1eef6000-7fdc1f0f6000 ---p 00067000 08:01 2240985     /usr/lib/x86_64-linux-gnu/libgmp.so.10.0.5 
7fdc1f0f6000-7fdc1f0fe000 rw-p 00067000 08:01 2240985     /usr/lib/x86_64-linux-gnu/libgmp.so.10.0.5 
7fdc1f0fe000-7fdc1f11e000 r-xp 00000000 08:01 1445677     /lib/x86_64-linux-gnu/ld-2.13.so 
7fdc1f2fb000-7fdc1f2fe000 rw-p 00000000 00:00 0 
7fdc1f31b000-7fdc1f31d000 rw-p 00000000 00:00 0 
7fdc1f31d000-7fdc1f31e000 r--p 0001f000 08:01 1445677     /lib/x86_64-linux-gnu/ld-2.13.so 
7fdc1f31e000-7fdc1f31f000 rw-p 00020000 08:01 1445677     /lib/x86_64-linux-gnu/ld-2.13.so 
7fdc1f31f000-7fdc1f320000 rw-p 00000000 00:00 0 
7fffa2304000-7fffa2325000 rw-p 00000000 00:00 0       [stack] 
7fffa23b2000-7fffa23b4000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted 
+0

컴파일 할 때 -lgmp 옵션을 넣으려고 했습니까? 그것은'gcc -lgmp'와 같아야합니다. – Garp

+2

나는 doc을 읽지 않은 사람들이 C++ wrapper를 대신 사용하기를 희망한다. 에러가 발생하기 쉽다.'mpz_class i; mpz_class n ("338852330881981183"); while (i * i

+0

@MarcGlisse : 동의했지만, Juicy는 그의 질문을 C++가 아니라 C로 표기했습니다! –

답변

5

당신은 mpz_initinitialize GMP의 BigInteger를 사용한다. 그래서 main 기능은 아마 그런 다음 gcc -Wall -Wextra -g yourprog.c -lgmp -o yourprog 컴파일해야 mpz_clear

에 호출하기 전에

mpz_out_str (stdout, 10, x); 

를 사용 main의 끝 부분 outputx 원하는, BTW

mpz_t n; 
mpz_t i; 
mpz_t o; // Hold constant mpz "1" for incrementing i 
mpz_t x; // Holds "i * i" each loop 

mpz_init(n); 
mpz_init(i); 
mpz_init(o); 
mpz_init(x); 

로 시작해야 . 프로그램이 올바르게 디버깅되면 -O2 mtune=native을 추가하여 프로그램을 최적화 할 수 있습니다.

+0

+1 감사합니다.'init's가 해냈습니다! – Juicy