Thanks, Chris, and Cliff too.
Yes, a mod inverse helps a lot. Once you've got an inverse, it's easy
to derive a modular divide, or vice
versa.
inversep in primutil.ijs is well defined for a prime modulus - the name
"primutil" does of course imply
a prime modulus.
inversep also appears to work ok for those numbers in the ring of
integers modulo non-prime modulus.
eg members of the ring modulo 10 are {1 3 7 9}
{{ y,:y (10 mtimes) (10&inversep)"0 y}} 1 3 7 9
1 3 7 9
1 1 1 1
{{ y,:y (10 mtimes) (10&mrecip)"0 y}} 1 3 7 9
1 3 7 9
1 1 1 1
I find rather better performance with my mrecip:
ts =: 6!:2 , 7!:2@]
1 p: 1000000009
1
ts'100000009 mrecip 999999000 + >:i.1007'
0.0061255 22592
ts'100000009 inversep"0] 999999000 + >:i.1007'
0.0798054 97160
ts'100000009 mi"0] 999999000 + >:i.1007'
0.0908823 174192
A bit surprising as the Extended Euler Algorithm is supposed to be best
for getting a modular inverse.
1000000009 (mrecip-:inversep"0) 999999000 + >:i.1007
1
1000000009 ((1000000009 mi)"0 @] -:inversep"0) 999999000 + >:i.1007
1
Here's mrecip:
mrecip =: {{
y (x&|@^) <: 5 p: x
}}"0
As for inversep, and Cliff's mi, mrecip is well-defined for prime x,
and also for composite
x for y in x's ring, ie where 1 = x +. y
Results are NOT reliable for arguments not coprime with the modulus.
Thanks,
Mike
On 03/04/2023 16:22, chris burke wrote:
Cliff
There are some mod functions in the math/misc addon, e.g. this gives
Mike Day's table
load 'math/misc/primutil'
f=: (17 timesmod) (17&inversep)
2 3 4 f"0 table >:i.8
+---+---------------------+
|f"0|1 2 3 4 5 6 7 8|
+---+---------------------+
|2 |2 1 12 9 14 6 10 13|
|3 |3 10 1 5 4 9 15 11|
|4 |4 2 7 1 11 12 3 9|
+---+---------------------+
Any improvements welcome, thanks.
Chris
On Mon, Apr 3, 2023 at 5:49 AM Clifford Reiter<reit...@lafayette.edu> wrote:
I dug up an old extended gcd to build an adverb for modular divide
NB. Find the gcd of two numbers
NB. and coef giving gcd as a linear combination of y
gcd2x=: 3 : 0
'r0 r1'=.y
's0 s1'=.1 0x
't0 t1'=.0 1x
while. r1 ~: 0 do.
q=. r0 <.@% r1
'r0 r1'=. r1,r0-q*r1
's0 s1'=. s1,s0-q*s1
't0 t1'=. t1,t0-q*t1
end.
r0,s0,t0
)
gcd2x 51 119
17 _2 1
_2 1 +/ . * 51 119
17
NB. adverb giving divide (inverse) mod m
mi=:1 : 0"0
'r0 s0 t0'=:gcd2x m,y
if. r0=1 do. m|t0 else. 1r0 end.
:
m|x*m mi y
)
17 mi 6
3
NB. Mike Day's Table
2 3 4 (17 mi)table >:i.8
+-+---------------------+
| |1 2 3 4 5 6 7 8|
+-+---------------------+
|2|2 1 12 9 14 6 10 13|
|3|3 10 1 5 4 9 15 11|
|4|4 2 7 1 11 12 3 9|
+-+---------------------+
I have some questions regarding system solving modulo m that I will offer
in a new thread in a few days.
Best, Cliff
On Thu, Mar 30, 2023 at 12:11 PM Clifford Reiter<reit...@lafayette.edu>
wrote:
I think I recall a conversation, some decades ago, with Roger about
whether specifying a modulus for system solving makes sense for J. I
thought maybe that was a use for the fit conjunction but now think that
would be a poor choice for such a numeric function. I have vague memories
of J essays on guass-jordan row reduction and extended gcds but didn't find
them poking around J help.
They could be useful for what I had in mind and modular inverses would be
part of that. Perhaps someone has those handy and could offer an addon? New
adverbs giving b m %.: a and m %.: a anyone?
Best, Cliff
On Wed, Mar 29, 2023 at 5:02 PM 'Michael Day' via Programming <
programm...@jsoftware.com> wrote:
While this primitve works nicely in an example:
(2 3 4) (17&|@*)/ table >:i.8
+-------+---------------------+
|17&|@*/|1 2 3 4 5 6 7 8|
+-------+---------------------+
|2 |2 4 6 8 10 12 14 16|
|3 |3 6 9 12 15 1 4 7|
|4 |4 8 12 16 3 7 11 15|
+-------+---------------------+
I find this less satisfying:
(2 3 4) (17&|@%)/ table >:i.8
+-------+-----------------------------------------------+
|17&|@%/|1 2 3 4 5 6 7 8|
+-------+-----------------------------------------------+
|2 |2 1 0.666667 0.5 0.4 0.333333 0.285714 0.25|
|3 |3 1.5 1 0.75 0.6 0.5 0.428571 0.375|
|4 |4 2 1.33333 1 0.8 0.666667 0.571429 0.5|
+-------+-----------------------------------------------+
I have a function which does what one would expect. I'll rename it as
m17div here, details unimportant for this discussion:
(2 3 4) m17div/ table >:i.8
+-------+---------------------+
|m17div/|1 2 3 4 5 6 7 8|
+-------+---------------------+
|2 |2 1 12 9 14 6 10 13|
|3 |3 10 1 5 4 9 15 11|
|4 |4 2 7 1 11 12 3 9|
+-------+---------------------+
( eg 3 % 2 == 10 mod 17 because 3 = 17 | 2 * 10 )
Would anyone else find this return of integer results useful or is it
better
to force a floating output?
(Henry tells me that m&|@^ returns integer results, working ok when m^2
can be represented as a non-extended integer.)
Thanks,
Mike
----------------------------------------------------------------------
For information about J forums seehttp://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums seehttp://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums seehttp://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm