Thun/implementations/Prolog/source/nerdsniped.txt

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.