Nicolas Cellier uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-nice.1109.mcz==================== Summary ====================
Name: Kernel-nice.1109
Author: nice
Time: 23 July 2017, 2:42:14.918543 pm
UUID: 1496608c-48fd-4bb2-b572-46e8b61421a9
Ancestors: Kernel-eem.1108
Define gcd: and lcm: for Fraction.
For example, 1/5 and 1/7 are both whole multiple of 1/35 (which is their gcd).
=============== Diff against Kernel-eem.1108 ===============
Item was added:
+ ----- Method: Fraction>>gcd: (in category 'arithmetic') -----
+ gcd: aFraction
+ | d |
+ d := denominator gcd: aFraction denominator.
+ ^(numerator *(aFraction denominator/d) gcd: aFraction numerator*(denominator/d)) / (denominator/d*aFraction denominator)!
Item was added:
+ ----- Method: Fraction>>lcm: (in category 'arithmetic') -----
+ lcm: n
+ "Answer the least common multiple of the receiver and n."
+
+ ^self // (self gcd: n) * n!
Item was changed:
----- Method: Integer>>gcd: (in category 'mathematical functions') -----
gcd: anInteger
"See Knuth, Vol 2, 4.5.2, Algorithm L"
"Initialize"
| higher u v k uHat vHat a b c d vPrime vPrimePrime q t |
+ anInteger denominator = 1 ifFalse: [^anInteger gcd: self].
higher := SmallInteger maxVal highBit.
u := self abs max: (v := anInteger abs).
v := self abs min: v.
[v class == SmallInteger]
whileFalse:
[(uHat := u bitShift: (k := higher - u highBit)) class == SmallInteger
ifFalse:
[k := k - 1.
uHat := uHat bitShift: -1].
vHat := v bitShift: k.
a := 1.
b := 0.
c := 0.
d := 1.
"Test quotient"
[(vPrime := vHat + d) ~= 0
and: [(vPrimePrime := vHat + c) ~= 0 and: [(q := uHat + a // vPrimePrime) = (uHat + b // vPrime)]]]
whileTrue:
["Emulate Euclid"
c := a - (q * (a := c)).
d := b - (q * (b := d)).
vHat := uHat - (q * (uHat := vHat))].
"Multiprecision step"
b = 0
ifTrue:
[v := u rem: (u := v)]
ifFalse:
[t := u * a + (v * b).
v := u * c + (v * d).
u := t]].
^ v gcd: u!
Item was changed:
----- Method: SmallInteger>>gcd: (in category 'arithmetic') -----
gcd: anInteger
"See SmallInteger (Integer) | gcd:"
| n m |
+ anInteger denominator = 1 ifFalse: [^anInteger gcd: self].
n := self.
m := anInteger.
[n = 0]
whileFalse:
[n := m \\ (m := n)].
^ m abs!