Karim Belabas on Wed, 21 Jan 2015 21:49:22 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Mixing variables in Mod expressions


* Karim Belabas [2015-01-20 11:51]:
> * Pascal Molin [2015-01-20 11:39]:
> > What suprises me is that the moduli is removed in the result.
[...]
> The moduli is not removed, but indeed not printed:
[...]
> A 0 t_POLMOD is printed as 0 and omitted in polynomial coefficients.
> For t_INTMOD, 0 is still explicitly written as Mod(0, N) [ but still omitted
> when a polynomial coefficient ]
> 
> I don't see any rationale for this. I can fix the discrepancy, and
> explicitly write Mod(0, x) above instead of 0.

Done in master. Now we have

\\ 0 by itself is printed verbosely
(21:26) gp >  Mod(x,x^2-3) + Mod(x,x^2-5)
%1 = Mod(0, 1)

(21:26) gp > Mod(1,2)+Mod(1,3)
%2 = Mod(0, 1)

\\ ... but not as polynomial coefficients
(21:26) gp > (x^100+1)*Mod(1,2)
%3 = Mod(1, 2)*x^100 + Mod(1, 2)

(21:26) gp > (x^100+1)*Mod(1,y)
%4 = Mod(1, y)*x^100 + Mod(1, y)

* Aurel.Page@math.u-bordeaux1.fr [2015-01-20 11:21]:
> What about a warning when having to take gcd of moduli ? It would keep the
> current behaviour but a student should understand he is doing something
> wrong.

If we consider an operation as legitimate (and here I do, PARI philosophy...)
there should be no warning. OTOH it's *probably* a mistake when the "base ring"
suddenly changes in this way.

Maybe a warning when 'debug' is non-zero ? As in

  (21:32) gp > f(x)=0;
  (21:32) gp > \g1
     debug = 1
  (21:32) gp > f(y)
    ***   Warning: compiler generates copy for `y'.
  %1 = 0
<aside>
Here the copy optimizer tells us it had to generate a copy of 'y' when
calling user function 'f', although it would probably be alright not to.
The user can then rewrite his code as e.g.
  my(y=y);f(y)
thereby killing the warning and producing faster bytecode:
  ? y=vector(10^5);
  ? for(i=1,1000,f(y))
    ***   Warning: compiler generates copy for `y'.
  time = 884 ms.
  ? my(y=y);for(i=1,1000,f(y))
  time = 12 ms.
</aside>

Something like

  ? Mod(1,2)+Mod(1,3)
  %1 = Mod(0, 1)
  ? \g1
     debug = 1
  ? Mod(1,2)+Mod(1,3)
    *** _+_: Warning: coercing quotient rings; moduli 2 and 3 -> 1.
  %2 = Mod(0, 1)


Cheers,

    K.B.
--
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite de Bordeaux         Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation    http://www.math.u-bordeaux.fr/~kbelabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux.fr/  [PARI/GP]
`