factor/extra/random/blum-blum-shub/blum-blum-shub.factor

31 lines
789 B
Factor
Raw Normal View History

2009-05-10 17:33:43 -04:00
USING: kernel math sequences namespaces math.primes
math.functions accessors random ;
2008-03-19 17:18:03 -04:00
IN: random.blum-blum-shub
2008-04-07 20:28:54 -04:00
! Blum Blum Shub, n = pq, x_i+1 = x_i ^ 2 mod n
! return low bit of x+1
2008-03-19 17:18:03 -04:00
TUPLE: blum-blum-shub x n ;
2008-04-07 20:28:54 -04:00
<PRIVATE
2008-03-19 17:18:03 -04:00
: generate-bbs-prime ( numbits -- p )
dup random-prime dup 4 mod 3 =
[ nip ] [ drop generate-bbs-prime ] if ;
2008-03-19 17:18:03 -04:00
: generate-bbs-primes ( numbits -- p q )
[ generate-bbs-prime ] [ generate-bbs-prime ] bi ;
2008-03-19 17:18:03 -04:00
: next-bbs-bit ( bbs -- bit )
dup [ x>> 2 ] [ n>> ] bi ^mod [ >>x drop ] [ 1 bitand ] bi ;
PRIVATE>
2008-03-19 17:18:03 -04:00
: <blum-blum-shub> ( numbits -- blum-blum-shub )
generate-bbs-primes *
[ find-relative-prime ] keep
blum-blum-shub boa ;
2008-03-19 17:18:03 -04:00
2008-03-28 16:09:21 -04:00
M: blum-blum-shub random-32* ( bbs -- r )
2008-04-07 20:28:54 -04:00
0 32 rot
[ next-bbs-bit swap 1 shift bitor ] curry times ;