2005-10-23 19:07:16 -04:00
|
|
|
IN: math-contrib
|
2005-11-07 20:26:32 -05:00
|
|
|
USING: errors kernel sequences math sequences-internals ;
|
2005-10-21 03:42:38 -04:00
|
|
|
|
|
|
|
: deg>rad pi * 180 / ; inline
|
|
|
|
: rad>deg 180 * pi / ; inline
|
|
|
|
|
|
|
|
: lcm ( a b -- c )
|
|
|
|
#! Smallest integer such that c/a and c/b are both integers.
|
|
|
|
2dup gcd nip >r * r> /i ; foldable
|
|
|
|
|
|
|
|
: mod-inv ( x n -- y )
|
|
|
|
#! Compute the multiplicative inverse of x mod n.
|
|
|
|
gcd 1 = [ "Non-trivial divisor found" throw ] unless ;
|
|
|
|
foldable
|
|
|
|
|
|
|
|
: (^mod) ( n z w -- z^w )
|
|
|
|
1 swap [
|
|
|
|
1 number= [ dupd * pick mod ] when >r sq over mod r>
|
|
|
|
] each-bit 2nip ; inline
|
|
|
|
|
|
|
|
: ^mod ( z w n -- z^w )
|
|
|
|
#! Compute z^w mod n.
|
|
|
|
over 0 < [
|
|
|
|
[ >r neg r> ^mod ] keep mod-inv
|
|
|
|
] [
|
|
|
|
-rot (^mod)
|
|
|
|
] if ; foldable
|
|
|
|
|
|
|
|
: ** ( u v -- u*v' ) conjugate * ; inline
|
|
|
|
|
|
|
|
: c. ( v v -- x )
|
|
|
|
#! Complex inner product.
|
|
|
|
0 [ ** + ] 2reduce ;
|
2005-11-07 20:26:32 -05:00
|
|
|
|
|
|
|
TUPLE: frange from step length ;
|
|
|
|
|
|
|
|
C: frange ( from step to -- seq )
|
|
|
|
#! example: 0 .01 10 <frange> >array
|
|
|
|
>r pick - swap [ / ] keep -rot swapd >fixnum 1+ r>
|
|
|
|
[ set-frange-length ] keep
|
|
|
|
[ set-frange-step ] keep
|
|
|
|
[ set-frange-from ] keep ;
|
|
|
|
|
|
|
|
M: frange length ( frange -- n )
|
|
|
|
frange-length ;
|
|
|
|
|
|
|
|
: decrement-length ( frange -- )
|
|
|
|
[ frange-length 1- ] keep set-frange-length ;
|
|
|
|
|
|
|
|
: increment-start ( frange -- )
|
|
|
|
[ [ frange-from ] keep frange-step + ] keep set-frange-from ;
|
|
|
|
|
2005-11-09 17:48:55 -05:00
|
|
|
: frange-range ( frange -- range )
|
|
|
|
[ frange-step ] keep frange-length 1- * ;
|
|
|
|
|
2005-11-07 20:26:32 -05:00
|
|
|
M: frange nth ( n frange -- obj ) [ frange-step * ] keep frange-from + ;
|
|
|
|
M: frange nth-unsafe ( n frange -- obj ) nth ;
|
|
|
|
|
|
|
|
|