6 local fun loop (big
: IntInf
.int, small
: IntInf
.int): IntInf
.int =
10 IntInf
.rem (big
, small
))
11 in fun gcd (x
: IntInf
.int, y
: IntInf
.int): IntInf
.int =
12 let val x
= IntInf
.abs x
14 val (x
, y
) = if x
>= y
21 fun reduce (num
: IntInf
.int, den
: IntInf
.int) : IntInf
.int * IntInf
.int =
22 let val g
= gcd (num
, den
)
28 else let val rnum
= IntInf
.quot (num
, gs
)
29 val badn
= IntInf
.rem (num
, gs
)
30 val rden
= IntInf
.quot (den
, gs
)
31 val badd
= IntInf
.rem (den
, gs
)
33 orelse num
<> rnum
* gs
35 orelse den
<> rden
* gs
36 then die ("Bad: num " ^
(IntInf
.toString num
)
37 ^
", den " ^
(IntInf
.toString den
)
38 ^
", gcds " ^
(IntInf
.toString gs
)
39 ^
", rnum " ^
(IntInf
.toString rnum
)
40 ^
", rden " ^
(IntInf
.toString rden
)
41 ^
", badn " ^
(IntInf
.toString badn
)
42 ^
", badd " ^
(IntInf
.toString badd
))
48 fun addrecip (xxx
: int, (num
: IntInf
.int, den
: IntInf
.int))
49 : IntInf
.int * IntInf
.int =
50 let val xxx
= IntInf
.fromInt xxx
51 val xnum
= xxx
* num
+ den
53 in reduce (xnum
, xden
)
56 fun printRat (num
: IntInf
.int, den
: IntInf
.int): unit
=
57 print (IntInf
.toString num ^
"/" ^ IntInf
.toString den ^
"\n")
59 fun spin (limit
: int): IntInf
.int * IntInf
.int =
60 let fun loop (n
: int, res
: IntInf
.int * IntInf
.int)
61 : IntInf
.int * IntInf
.int =
71 val (n
, d
) = spin
3000
72 val _
= printRat (n
, d
)
73 val _
= printRat (reduce (n
* d
* n
, d
* d
* n
))
74 val _
= printRat (reduce (n
+ 1, d
+ 1))
75 val _
= printRat (reduce (n
* (d
+ 1) + d
* (n
+ 1), d
* (d
+ 1)))