proc SteinsGCD { u v } { #begin with simple cases if { $u == $v } { return $u } if { $u == 0 } { return $v } if { $v == 0 } { return $u } #looking for factors of 2, u is even if { (~( $u )) & 1 } { #v is odd if { $v & 1 } { return [SteinsGCD [expr $u >> 1] $v ] } } #both u and v are even if { ((~( $u )) & 1) & ((~( $u )) & 1)} { return [expr [ SteinsGCD [expr $u >> 1] [expr $v >> 1 ] ] <<1] } #u is odd, v is even if { (~( $v )) & 1 } { return [SteinsGCD $u [expr $v >> 1] ] } #reduce larger argument if { $u > $v } { return [SteinsGCD [expr [ expr $u - $v]>>1] $v] } return [SteinsGCD [expr [ expr $v - $u] >> 1] $u] } puts "First Number\t Second Number\t GCD" puts "------------\t -------------\t ---" for { set x 0 } { $x < 100 } { incr x } { set q [expr int([expr rand() * 100])] set w [expr int([expr rand() * 100])] set a [SteinsGCD $q $w] puts "$q\t\t$w\t\t$a" }
We use cookies to provide and improve our services. By using our site, you consent to our Cookies Policy. Accept Learn more