61 lines
1.4 KiB
Factor
61 lines
1.4 KiB
Factor
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
IN: math
|
|
USING: errors kernel math math-internals ;
|
|
|
|
! Power-related functions:
|
|
! exp log sqrt pow ^mod
|
|
|
|
: exp >rect swap fexp swap polar> ;
|
|
: log >polar swap flog swap rect> ;
|
|
|
|
: sqrt ( z -- sqrt )
|
|
>polar dup pi = [
|
|
drop fsqrt 0 swap rect>
|
|
] [
|
|
swap fsqrt swap 2 / polar>
|
|
] ifte ;
|
|
|
|
GENERIC: ^ ( z w -- z^w )
|
|
|
|
: ^mag ( w abs arg -- magnitude )
|
|
>r >r >rect swap r> swap fpow r> rot * fexp / ;
|
|
|
|
: ^theta ( w abs arg -- theta )
|
|
>r >r >rect r> flog * swap r> * + ;
|
|
|
|
M: number ^ ( z w -- z^w )
|
|
swap >polar 3dup ^theta >r ^mag r> polar> ;
|
|
|
|
: each-bit ( n quot -- | quot: 0/1 -- )
|
|
#! Apply the quotation to each bit of the number. The number
|
|
#! must be positive.
|
|
over 0 number= [
|
|
2drop
|
|
] [
|
|
2dup >r >r >r 1 bitand r> call r> -1 shift r> each-bit
|
|
] ifte ; inline
|
|
|
|
: (integer^) ( z w -- z^w )
|
|
1 swap [ 1 number= [ dupd * ] when >r sq r> ] each-bit nip ;
|
|
|
|
M: integer ^ ( z w -- z^w )
|
|
over 0 number= over 0 number= and [
|
|
"0^0 is not defined" throw
|
|
] [
|
|
dup 0 < [ neg ^ recip ] [ (integer^) ] ifte
|
|
] ifte ;
|
|
|
|
: (^mod) ( n z w -- z^w )
|
|
1 swap [
|
|
1 number= [ dupd * pick mod ] when >r sq over mod r>
|
|
] each-bit 2nip ;
|
|
|
|
: ^mod ( z w n -- z^w )
|
|
#! Compute z^w mod n.
|
|
over 0 < [
|
|
[ >r neg r> ^mod ] keep mod-inv
|
|
] [
|
|
-rot (^mod)
|
|
] ifte ;
|