2 prototypes ensureNamespace: #benchmark &delegate: True.
4 benchmark define: #Transformation &slots: {
5 #q -> 0. #r -> 0. #s -> 0. #t -> 0. #k -> 0.
8 benchmark define: #PiDigitSpigot &slots: {
12 t@(Transformation traits) unity
14 t clone `>> [q := 1. r := 0. s := 0. t := 1. ]
17 t1@(Transformation traits) * t2@(Transformation traits)
21 r := (t1 q * t2 r) + (t1 r * t2 t).
22 s := (t1 s * t2 q) + (t1 t * t2 s).
23 t := (t1 s * t2 r) + (t1 t * t2 t). ]
26 t@(Transformation traits) extract: i@(Integer traits)
28 ((t q * i + t r) / (t s * i + t t)) floor
31 t@(Transformation traits) next
33 t `>> [k := t k + 1. q := t k. r := 4 * t k + 2. s := 0. t := 2 * t k + 1. ]
36 s@(PiDigitSpigot traits) new
39 z := Transformation unity.
40 x := Transformation clone.
41 inverse := Transformation clone. ]
44 s@(PiDigitSpigot traits) next
46 (s isSafe: (y ::= s digit))
47 ifTrue: [s z := s produce: y. y]
48 ifFalse: [s z := s consume: s x next. s next]
51 s@(PiDigitSpigot traits) digit
56 s@(PiDigitSpigot traits) isSafe: i@(Integer traits)
61 s@(PiDigitSpigot traits) produce: i@(Integer traits)
63 (inv ::= s inverse) `>> [q := 10. r := -10 * i. s := 0. t := 1. ].
67 s@(PiDigitSpigot traits) consume: t@(Transformation traits)
72 n@(Integer traits) piDigitsTo: s@(Stream traits)
73 [| length pidigits stream i |
76 pidigits := PiDigitSpigot new.
80 [n timesRepeat: [s ; (pidigits next as: String)].
81 n upTo: length - 1 do: [| :each | s ; ' '].
84 [length timesRepeat: [s ; (pidigits next as: String)].
86 s ; '\t :' ; (i as: String) ; '\n'.
90 n@(Integer traits) pidigits
92 (File newNamed: 'tests/benchmark/pidigits.out' &mode: File CreateWrite)
93 sessionDo: [| :f | n piDigitsTo: f writer]