| Karim Belabas on Mon, 25 Jul 2011 00:22:59 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: znlog() behavior |
* Bill Allombert [2011-07-24 00:11]:
> On Wed, Jul 20, 2011 at 03:31:53PM +0200, Max Alekseyev wrote:
> > And here is another bug, isn't it?
> >
> > ? znlog(6,Mod(2,7),znorder(Mod(2,7)))
> > %2 = 1
>
> Sort of. (The code actually returns 3\2, see the attached patch which fix this issue).
> The problem is that there is no interfaces for reporting "no solution".
I have implemented one in current svn: return the "impossible value" []
if there are no solution (same convention as in bestappr(), for instance).
> For example:
> ? znlog(2,Mod(4,17),znorder(Mod(4,17)))
> *** at top-level: znlog(2,Mod(4,17),zn
> *** ^--------------------
> *** znlog: gen_Shanks_log: supplied order (= 2) is incorrect.
>
> but the supplied order is actually correct.
> Maybe we should just do pari_err(consister,"gen_Shanks_log") instead.
(23:45) gp > znlog(2,Mod(4,17),znorder(Mod(4,17)))
%1 = []
On Wed, Jul 20, 2011 at 09:17:15PM +0200, Karim Belabas wrote:
> * Max Alekseyev [2011-07-20 20:57]:
> > Yet another problematic input:
> >
> > ? znlog(3,Mod(3,8),znorder(Mod(3,8)))
> > *** at top-level: znlog(3,Mod(3,8),zno
> > *** ^--------------------
> > *** znlog: not a primitive root in znlog.
> > *** Break loop: type 'break' to go back to GP
> >
> > I would expect it to simply return 1.
>
> This one is a bug. Ackowledged :-)
And also fixed in svn:
(23:45) gp > znlog(3,Mod(3,8),znorder(Mod(3,8)))
%1 = 1
I rewrote the function so that it no longer assumes that the group is
cyclic ( I also removed a number of "not absolutely necessary"
assumptions ). This also reduced the number of "undefined behaviour"
cases.
This has a price, but only in very simple situations:
(23:50) gp > for(i=1,10^6,znlog(2,Mod(2,3))) \\ BEFORE
time = 248 ms
(23:50) gp > for(i=1,10^6,znlog(2,Mod(2,3))) \\ AFTER
time = 1,120 ms.
(23:50) gp > for(i=1,10^6,znlog(10,Mod(2,101))) \\ BEFORE
time = 3,628 ms.
(23:50) gp > for(i=1,10^6,znlog(10,Mod(2,101))) \\ AFTER
time = 2,416 ms.
So znlog() is about 50% slower for very simple (non trivial) queries. I'll try
to improve on this.
Keep testing, thanks for your feedback !
K.B.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux1.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP]
`
--513BC72376.1311544376/smail.math.u-bordeaux1.fr--