! Copyright (C) 2017 Jon Harper. ! See http://factorcode.org/license.txt for BSD license. USING: kernel kernel.private math math.functions math.functions.private math.private sequences.private ; IN: math.functions.integer-logs ] [ [ [ 1 - ] [ 10 / ] bi* ] dip ] do while 2drop ; : bignum-integer-log10-find-up ( guess 10^guess n -- log10 ) [ 10 * ] dip [ 2dup <= ] [ [ [ 1 + ] [ 10 * ] bi* ] dip ] while 2drop ; : bignum-integer-log10-guess ( n -- guess 10^guess ) (log2) >integer log10-2 * >integer dup 10^ ; : bignum-integer-log10 ( n -- x ) [ bignum-integer-log10-guess ] keep 2dup > [ bignum-integer-log10-find-down ] [ bignum-integer-log10-find-up ] if ; inline M: fixnum (integer-log10) fixnum-integer-log10 { fixnum } declare ; inline M: bignum (integer-log10) bignum-integer-log10 ; inline PRIVATE> ERROR: log-expects-positive x ; integer ] dip call ; inline : (ratio-integer-log) ( ratio quot base -- log ) pick 1 >= [ drop ((ratio-integer-log)) ] [ [ recip ] 2dip [ drop ((ratio-integer-log)) ] [ nip pick ^ = ] 3bi [ 1 + ] unless neg ] if ; inline M: ratio (integer-log2) ( r -- n ) [ (integer-log2) ] 2 (ratio-integer-log) ; M: ratio (integer-log10) ( r -- n ) [ (integer-log10) ] 10 (ratio-integer-log) ; : (integer-log) ( x quot -- n ) [ dup 0 > ] dip [ log-expects-positive ] if ; inline PRIVATE> : integer-log10 ( x -- n ) [ (integer-log10) ] (integer-log) ; inline : integer-log2 ( x -- n ) [ (integer-log2) ] (integer-log) ; inline