Thanks for the pointer to mo.  I had worked up a verb for
reciprocal y modulo x, x & y coprime, some months ago and
eventually found it (!) Also, as you say,  mo can be used:

Here's my earlier one rendered into J6...

NB. reciprocal of y mod x
NB. plagiarism/adaptation of J library gcd verb
mrecip =: 3 : 0 ~
:
b   =. x: y
p =. -. r =. 0 'xp yr' =.(x: x,p);y,r
assert. 1 = b +. {.xp
while. 0 < x: | {.yr do.
NB. while. * | y do.  ... enable these NB.s if scalars preferred
  'xp yr'  =. yr;   xp     - yr     * <. ({.xp) % {.yr
NB.'x p y r'=. y, r, (x, p) - (y, r)    * <. x % y
end.
b | x:{:xp
NB. b | p
)

NB.   and here's a verb using mo:
NB.       mo (& mopk) not listed here,
NB.       mo and mopk as in J Wiki for "multiplicative order"
mrecip1=:  dyad : 0
f =. (x:x) 1 : 'm&|@^'
NB. x mo y ==> least n such that 1=y|x^n
NB. so <:@mo gives least power m such that 1 = y| x * x^m
y ([f <:@mo) x
)

   1000000000000x(]*mrecip)  372313
79925000000000001
   1000000000000x(]*mrecip1) 372313
79925000000000001
>ts each'1000000000000x(]*mrecip) 372313 ';'1000000000000x(]*mrecip1) 372313 '
0.000485816  5504
0.00269196 29440
These timings are a bit surprising, since mrecip does several more loops than mo & mopk, at least for this example.
Mike

Roger Hui wrote:

The obstacle is not implementational but definitional.
The assumed requirement was that x m&|@^ y should be
equivalent to m|x^y , and therefore can not be used to compute inverses in the group of integers mod m without redefining the meaning of x^y for negative powers. This assumption should perhaps be reexamined because it seems much more useful for x m&|@^ y to compute powers mod m rather than m|x^y .

Note that if you use instead the phrase
  x m&|@^ (y mo m)|y
where mo is the multiplicative order function posted a few days ago, then you can compute powers mod m for all integer y
(and obtain tremendous efficiency gains for large magnitude y).



----- Original Message ----- From: "Mike Day" <[EMAIL PROTECTED]>
To: "Programming forum" <[email protected]>
Sent: Monday, February 27, 2006 2:18 AM
Subject: Re: [Jprogramming] If Maple can, why can't J?

...

Roger mentioned that Mathematica's PowerMod function also offers a
fast solution.  I looked at its online description at
  http://documents.wolfram.com/mathematica/book/section-3.2.5
which shows that it's also implemented for negative powers:

   This gives the modular inverse of 3 modulo 7
   In[19]:=  PowerMod[3, -1, 7]
   Out[19]= 5

whereas in J:
  3(7&|@^)0 6 - 1 NB. could J have integer solutions for neg powers?
0.333333 5
Mike
..............
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to