diff --git a/basis/math/miller-rabin/miller-rabin.factor b/basis/math/miller-rabin/miller-rabin.factor index 8c237d0dc3..62d8ee4432 100755 --- a/basis/math/miller-rabin/miller-rabin.factor +++ b/basis/math/miller-rabin/miller-rabin.factor @@ -6,31 +6,28 @@ IN: math.miller-rabin odd ( n -- int ) dup even? [ 1+ ] when ; foldable +: >odd ( n -- int ) dup even? [ 1 + ] when ; foldable TUPLE: positive-even-expected n ; :: (miller-rabin) ( n trials -- ? ) - [let | r [ n 1- factor-2s drop ] - s [ n 1- factor-2s nip ] - prime?! [ t ] - a! [ 0 ] - count! [ 0 ] | - trials [ - n 1- [1,b] random a! - a s n ^mod 1 = [ - 0 count! - r [ - 2^ s * a swap n ^mod n - -1 = - [ count 1+ count! r + ] when - ] each - count zero? [ f prime?! trials + ] when - ] unless drop - ] each prime? ] ; + n 1 - :> n-1 + n-1 factor-2s :> s :> r + 0 :> a! + trials [ + drop + n-1 [1,b] random a! + a s n ^mod 1 = [ + f + ] [ + r [ 2^ s * a swap n ^mod n - -1 = ] any? + ] if + ] any? ; + PRIVATE> -: next-odd ( m -- n ) dup even? [ 1+ ] [ 2 + ] if ; +: next-odd ( m -- n ) dup even? [ 1 + ] [ 2 + ] if ; : miller-rabin* ( n numtrials -- ? ) over {