30 lines
		
	
	
		
			706 B
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			30 lines
		
	
	
		
			706 B
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2009 Doug Coleman.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: combinators.short-circuit kernel math math.functions
							 | 
						||
| 
								 | 
							
								math.primes random ;
							 | 
						||
| 
								 | 
							
								IN: math.primes.safe
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<PRIVATE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: safe-prime-candidate? ( n -- ? )
							 | 
						||
| 
								 | 
							
								    1 + 6 divisor? ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: next-safe-prime-candidate ( n -- candidate )
							 | 
						||
| 
								 | 
							
								    next-prime dup safe-prime-candidate?
							 | 
						||
| 
								 | 
							
								    [ next-safe-prime-candidate ] unless ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PRIVATE>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: safe-prime? ( q -- ? )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        [ 1 - 2 / dup integer? [ prime? ] [ drop f ] if ]
							 | 
						||
| 
								 | 
							
								        [ prime? ]
							 | 
						||
| 
								 | 
							
								    } 1&& ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: next-safe-prime ( n -- q )
							 | 
						||
| 
								 | 
							
								    next-safe-prime-candidate
							 | 
						||
| 
								 | 
							
								    dup safe-prime? [ next-safe-prime ] unless ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: random-safe-prime ( numbits -- p )
							 | 
						||
| 
								 | 
							
								    random-bits* next-safe-prime ;
							 |