| hermann on Thu, 06 Jul 2023 09:19:34 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: How to do t_INT bit operations? |
On 2023-07-05 21:22, Ruud H.G. van Tol wrote:
Is that the way to do t_INT bit operations in GP? Are there alternatives more like the C bit operators?? bit<TAB> bitand bitnegimply bitprecision bitxor bitneg bitor bittest You may want to check those functions (except bitprecision)The reference cards are also a good place to look for functions (here inrefcard.pdf, first page, section on "Operators")Also see: binary(), valuation(), logint(). Examples: 1. count trailing 0-bits: valuation(n,2). 2. count trailing 1-bits: valuation(n+1,2).
Thanks to both of you, avoided me to go into wrong direction!cado-nfs.py was able to factor up to RSA-140 really fast, with total time divided by
elapsed time >10 on 6C/12T 7600X CPU: https://github.com/Hermann-SW/RSA_numbers_factored/blob/main/cado-nfs/README.md#cado-nfsI try to parallelize computation of "Mod(qnr, p)^(p\4)" for really big primes to make that computation of "sqrt(-1) (mod p)" faster by utilizing all 12 HW threads.
A very first test with splitting exponentiation into 2 and then multiply results on slow
Raspberry Pi400 shows that runtime does not get worse by doing so:
pi@pi400-64:~/RSA_numbers_factored/pari $ gp -q split.gp
prime p has
2467 decimal digits length
8193 bits length
5 bits set
526ms
519ms
pi@pi400-64:~/RSA_numbers_factored/pari $
With this split.gp:
assert(b, v, s) = { if(!(b), error(Str(v) Str(s))); }
split(n) = {
my(l=2^(1+logint(n, 2)), a=[l,l], b=0, c);
while(n!=0,
c = 2^valuation(n, 2);
n = bitxor(n, c);
a[1+b] = bitxor(a[1+b], c);
b = !b;
);
[bitxor(a[1], l), bitxor(a[2], l)]
}
p = 2 ^ 2 ^ 13 + 897;
\\ p = (10^10000 - 1) \ 3 - 10^6333;
print("prime p has");
print(#digits(p), " decimal digits length");
print(#binary(p), " bits length");
print(vecsum(binary(p)), " bits set");
forprime(t=2,oo,if( kronecker(t, p)==-1, qnr=t; break()));
gettime();
s=lift(Mod(qnr, p)^(p\4));
print(Str(gettime())"ms");
assert(s^2 % p == p-1, "s^2 % p != p-1: ", s);
[a,b]=split(p\4);
gettime();
s1=Mod(qnr, p)^a;
s2=Mod(qnr, p)^b;
s=lift(s1*s2);
print(Str(gettime())"ms");
assert(s^2 % p == p-1, "s^2 % p != p-1: ", s);
\q
Regards,
Hermann.