Singular https://www.singular.uni-kl.de/forum/ |
|
SICA p.9 Exercise 1.1.13. https://www.singular.uni-kl.de/forum/viewtopic.php?f=10&t=2253 |
Page 1 of 1 |
Author: | Leon [ Thu May 02, 2013 9:46 am ] |
Post subject: | SICA p.9 Exercise 1.1.13. |
In A Singular Introduction to Commutative Algebra, the exercise says: "Write a Singular procedure, depending on two integers p, d, with p a prime, which returns all polynomials in F_p[x] of degree d such that the corresponding polynomial function vanishes. Use the procedure to display all f ∈ (Z/5Z)[x] of degree ≤ 6 such that f = 0." My solution: Code: proc zeroFunctions (int p, int d) { list l; //list of polynomials of degree d whose function is zero everywhere for (int i=p^d; i<p^(d+1); i=i+1) //the decimals of i in the numeral system with basis p determine the coefficients of f { poly f=0; int j,e=i,0; //e is the exponent while(j>0){ f=f+(j%p)*x^e; e=e+1; j=j / p; } int b=1; //boolean expression 'true' for (int k=0; k<p; k=k+1) { b = b and subst(f,x,k)==0; } //b remains true if f(j)=0 if (b==1) { l = l + list(f); } //if f is the zero function, we append it to l } return(l);} int p=5; ring R=p,(x),dp; zeroFunctions(p,6); This works correctly for p=2, d=3. I don't know exactly what happens for p=5, d=6. The computer seems to be stuck/frozen. Out of memory? Endless loop? Too long output? Question: How can I fix my procedure to work flawlessly? Question: How can I tell Singular not to print every message "redefining b" and "int division", i.e. I'd like to switch to 'silent mode'. |
Author: | gorzel [ Thu May 02, 2013 1:50 pm ] |
Post subject: | Re: SICA p.9 Exercise 1.1.13. |
This works correctly for p=2, d=3. I don't know exactly what happens for p=5, d=6. The computer seems to be stuck/frozen. Out of memory? Endless loop? Too long output? Question1: How can I fix my procedure to work flawlessly? Question2: How can I tell Singular not to print every message "redefining b" and "int division", i.e. I'd like to switch to 'silent mode'.[/quote] ad Question2; 1. Singular tells you that you should write Code: j=j div p; instead of j = j / p; 2. You could surpress the "redefine messages" by setting Code: option(noredefine); The reason that these messages occur, is that you define local variables inside the nested loops. So better you define at least Code: int j,e,b,k; poly f; at the very beginning and only set them in the loops. The first for loop you may leave with the declaration as it is Code: for (int i= ) { } General remark: Your list will have duplicate entries! |
Author: | Leon [ Sat May 04, 2013 3:27 pm ] |
Post subject: | Re: SICA p.9 Exercise 1.1.13. |
How can there be duplications in the list l? Every number j uniquely determines the coefficients of the polynomial f. Here p is assumed to be a prime number. |
Author: | gorzel [ Mon May 06, 2013 2:39 pm ] |
Post subject: | Re: SICA p.9 Exercise 1.1.13. |
OK; I don't remember what lead me to that apparently false claim. But I can't see why your code should not work. If I call zeroFunctions (5,6) in char 5, it gives immediately a list with 54 entries. |
Author: | Leon [ Tue May 07, 2013 2:31 pm ] |
Post subject: | Re: SICA p.9 Exercise 1.1.13. |
If I type Code: proc zeroFunctions (int p, int d) { option(noredefine); //no unnecessary "redefine f,j,e,k" notifications list l; //list of polynomials for (int i=p^d; i<p^(d+1); i=i+1) { poly f=0; int j,e=i,0; //e is the exponent while(j>0){ f=f+(j%p)*x^e; e=e+1; j=j div p; } int b=1; //boolean expression ’true’ for (int k=0; k<p; k=k+1){ b = b and subst(f,x,k)==0; } //b remains true iff f(k)==0 if (b==1) { l=l+list(f); } } //if f is the zero function, we append it to l return(l); } int p,d=5,6; ring R=p,(x),dp; zeroFunctions(p,d); then Singular returns 20 polynomials, which are all nonzero of degree 6. I don't think there are any duplications. I suspect that you didn't set the ring to ring R=p,(x),dp;. Thank you for your help! regards, Leon |
Page 1 of 1 | All times are UTC + 1 hour [ DST ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |