Alain SMEJKAL on Sat, 31 Dec 2005 00:05:34 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: The problem is here: |
----- Original Message ----- From: "Raúl Merino" <bcn_mat@hotmail.com> To: <pari-users@list.cr.yp.to> Sent: Friday, December 30, 2005 6:57 PM Subject: The problem is here: > The problem is in the last phrase, in the while. > I want that the variable primers are a vector of GEN. > I don't want 2^500 primes, i only want a prime x between 2^508 and 2^512. > It's a size to big for a variable of C. It is not easy to follow all the given code and I guess your problem is more simply how to use a Gen vector. So, if it helps, here is a short sample quickly built with Gp2c that generates such random primes using a vector. Regards, Alain. Here is the Gp script to convert : ===================== getprime()= { n = 2^508 + random(2^512-2^508); return(nextprime(n)); } test(n)= { primers = vector(n); for (i=1, n, primers[i] = getprime(); print("primers[" i "]:" primers[i]); ); } Here is the generated C code : ==================== /*-*- compile-command: "/usr/bin/gcc -c -o primer.gp.o -O3 -DGCC_INLINE -Wall -fno-strict-aliasing -fomit-frame-pointer -I/usr/local/include primer.gp.c && /usr/bin/gcc -o primer.gp.so -shared -O3 -DGCC_INLINE -Wall -fno-strict-aliasing -fomit-fram e-pointer -Wl,-noinhibit-exec --export-dynamic primer.gp.o -L/usr/local/lib -lpari.dll"; -*-*/ #include <pari/pari.h> /* GP;install("getprime","","getprime","./primer.gp.so"); GP;install("test","vD0,G,","test","./primer.gp.so"); GP;install("init_primer","v","init_primer","./primer.gp.so"); */ GEN getprime(void); void test(GEN n); void init_primer(void); /*End of prototype*/ void init_primer(void) /* void */ { pari_sp ltop = avma; /* ulong */ avma = ltop; return; } GEN getprime(void) { pari_sp ltop = avma; /* ulong */ GEN n = polx[fetch_user_var("n")], p1; n = gadd(gpowgs(gen_2, 508), genrand(gsub(gpowgs(gen_2, 512), gpowgs(gen_2, 508)))); p1 = gnextprime(n); p1 = gerepileupto(ltop, p1); return p1; } void test(GEN n) /* void */ { pari_sp ltop = avma; /* ulong */ GEN primers = polx[fetch_user_var("primers")]; GEN p1; /* vec */ { long l2; p1 = cgetg(itos(n)+1, t_VEC); for (l2 = 1; gcmpsg(l2, n) <= 0; ++l2) gel(p1, l2) = gen_0; } primers = p1; { pari_sp btop = avma, st_lim = stack_lim(btop, 1); /* ulong */ GEN i; for (i = gen_1; gcmp(i, n) <= 0; i = gaddgs(i, 1)) { gel(primers, itos(i)) = getprime(); pariputsf("primers[%Z]:%Z\n", i, gel(primers, itos(i))); if (low_stack(st_lim, stack_lim(btop, 1))) gerepileall(btop, 2, &i, &primers); } } avma = ltop; return; } Here what we get : ============ ? install("getprime","","getprime","./primer.gp.so") ? install("test","vD0,G,","test","./primer.gp.so") ? install("init_primer","v","init_primer","./primer.gp.so") ? test(5) primers[1]:99684198610705552240403721913399287812754901681697449520009748015 05442341246924907826896131754676423170270054 607751629932712609589958359524805563097907673 primers[2]:10373102466251827732765423494661034338667213535480178551177177644 26462199366425069267530212911925267959204539 5842872879633968305194737556725894646665803067 primers[3]:37523863628157039333562901487014298337027661465399437537175931821 36076036816653504885973654422965941922953504 171060858101065287928936440348571170348141283 primers[4]:35842629533298991606315024390919321760280893449750415689637344960 71262476156792123720757641274842102985701694 505565824493030126526669625022239411358348811 primers[5]:76349761816804581339526662264020052486645653121621615694349225619 00484263999612503274745783485111186451881530 946425275021324535646214419932209213237795817 ?