62 lines
1.1 KiB
Plaintext
62 lines
1.1 KiB
Plaintext
|
|
|
|
https://c9x.me/notes/2019-01-15.html
|
|
|
|
uint32_t mulinv(uint32_t a) {
|
|
uint32_t b = a; /* 1/a mod 2² */
|
|
b *= 2 - a*b; /* 1/a mod 2⁴ */
|
|
b *= 2 - a*b; /* 1/a mod 2⁸ */
|
|
b *= 2 - a*b; /* 1/a mod 2¹⁶ */
|
|
b *= 2 - a*b; /* 1/a mod 2³² */
|
|
return b;
|
|
}
|
|
|
|
In Joy:
|
|
|
|
|
|
b *= 2 - a*b
|
|
|
|
b = b * (2 - a*b)
|
|
|
|
|
|
|
|
a 2 a b * - b *
|
|
a 2 a*b - b *
|
|
a 2-(a*b) b *
|
|
a b*(2-(a*b))
|
|
|
|
a b over over
|
|
a b a b [* 2 swap -] dip *
|
|
a b a * 2 swap - b *
|
|
a b*a 2 swap - b *
|
|
a 2 b*a - b *
|
|
a 2-b*a b *
|
|
a (2-b*a)*b
|
|
|
|
G == over over [* 2 swap -] dip *
|
|
mulinv == dup 5 [G] times popd
|
|
|
|
Can compile G (mulinv must wait on times.)
|
|
|
|
?- gronk("fn", `over over [* 2 swap -] dip *`).
|
|
|
|
def fn(stack, expression, dictionary):
|
|
(i1, (i2, stack)) = stack
|
|
i3 = i1 * i2
|
|
i4 = 2 - i3
|
|
i5 = i4 * i1
|
|
return (i5, (i2, stack)), expression, dictionary
|
|
|
|
|
|
|
|
Using Unary
|
|
|
|
a b [F] dupdip *
|
|
a b F b *
|
|
a b * 2 swap - b *
|
|
|
|
|
|
G == [* 2 swap -] dupdip *
|
|
mulinv == dup 5 [[G] unary] times popd
|
|
|
|
Bleah. |