Singular https://www.singular.uni-kl.de/forum/ |
|
large exponent of minpoly? (use bigint?) https://www.singular.uni-kl.de/forum/viewtopic.php?f=10&t=1824 |
Page 1 of 1 |
Author: | gepo [ Fri Apr 09, 2010 12:30 am ] |
Post subject: | large exponent of minpoly? (use bigint?) |
This is what i want to compute: ring r=(2,a),x,dp; minpoly=a^5+a^3+1; //here is a min polynomial definition a^12345678987654321; can I make such a computation? since the exponent is so large, I tried to use bigint: bigint(a)^12345678987654321; but failed. Any ideas? Thanks Gepo |
Author: | gorzel [ Fri Apr 09, 2010 3:27 pm ] |
Post subject: | Re: large exponent of minpoly? (use bigint?) |
gepo wrote: This is what i want to compute: ring r=(2,a),x,dp; minpoly=a^5+a^3+1; //here is a min polynomial definition a^12345678987654321; can I make such a computation? since the exponent is so large, I tried to use bigint: bigint(a)^12345678987654321; but failed. Gepo No this is not possible in this way. bigint is only available for the coefficients (more precisely it is the type number), but not for the exponents. Code: 6.1 Limitations says * the maximal allowed exponent of a ring variable depends on the ordering of the ring and is at least 32767. First at all, it make not really sense, that you define such a big exponent for an algebraic extension of degree 5. Calculation with numbers in GF(25) means that all coefficients are considered as polynomials reduced by the minimal polynomial of degree 5. Hence all coefficients will be polynomial expressions in a with coefficients 0 or 1 and a degree less or equal to 4. So suppose you want compute a^23. Then consider polynomial division in char 2 of X^23 by X^5+X^3+1; where the latter is your minpoly. Code: > ring r2 =2,x,dp; > division(x23, x5+x3+1); [1]: _[1,1]=x18+x16+x14+x13+x12+x10+x9+x5+x4+x3+x2+x [2]: _[1]=x3+x2+x [3]: _[1,1]=1 The remainder is x3+x2+x and this will be the result in your ring defined at the beginning. Code: > setring r; > basering; // characteristic : 2 // 1 parameter : a // minpoly : (a5+a3+1) // number of vars : 1 // block 1 : ordering dp // : names x // block 2 : ordering C > a^23; (a3+a2+a) Well done ! But what you can do, that is that you use for exponentiation. the following proc Exp (An extended and improved version of proc exp from realrad.) // Your example again Code: > setring r; > Exp(a,12345678987654321); (a4+a3+a2+a+1) Here is the code: Code: proc Exp(def b, bigint N) "USAGE: Exp(b,N); a number / bigint /int ; N int / bigint RETURN: number resp. bigint b^N, NOTE: the return type is number, if b is of type number but not a transcendantal parameter bigint, if b is of type bigint int, if b is of type int, and b^N is less or eqaual to MAXINT = 2^31-1, resp. bigint otherwise " { string b_type = typeof(b); if (b_type != "int" and b_type != "bigint" and b_type != "number") { ERROR("// -- proc Exp: basis must be of type int, bigint or number"); } if (N < 0) { ERROR("// -- proc Exp: only non-negative exponent allowed"); } if (b_type=="number") { number Res = 1; number B = b; } if (b_type=="int" or b_type=="bigint" ) { bigint Res = 1; bigint B = b; } while (N > 0) { if (N mod 2 == 1) { Res = Res * B; N = N-1; Res; } B = B * B; N = N div 2; } if (b_type=="int" and Res<=2147483647) // MAXINT, { return(int(Res)); // convert result to int } else { return(Res); } } Checks Code: > Exp(2,80);
1208925819614629174706176 > typeof(_); bigint > Exp(2,8); 256 > typeof(_); int > ring r=0,x,dp; > number q = 2; > Exp(q,8); > typeof(_); number > Exp(q,80); 1208925819614629174706176 > typeof(_); number |
Page 1 of 1 | All times are UTC + 1 hour [ DST ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |