[Cuis-dev] Integer>>isPrime --- integrate please
Andres Valloud
ten at smallinteger.com
Fri Oct 11 23:49:30 PDT 2019
See attached.
Andres.
-------------- next part --------------
'From Cuis 5.0 [latest update: #3866] on 11 October 2019 at 11:48:07 pm'!
!Integer methodsFor: 'testing' stamp: 'a s + sqr 10/11/2019 22:04:06'!
isPrime
self < 3 ifTrue: [^self = 2].
self even ifTrue: [^false].
self \\ 3 = 0 ifTrue: [^self = 3].
self \\ 5 = 0 ifTrue: [^self = 5].
self < 8281 ifTrue: [
"Approximate sqrtFloor to avoid computational expense"
self \\ 7 = 0 ifTrue: [^self = 7].
self \\ 11 = 0 ifTrue: [^self = 11].
self \\ 13 = 0 ifTrue: [^self = 13].
12 to: (self bitShift: -6) + 11 by: 6 do: [:each |
self \\ (each+5) = 0 ifTrue: [^false].
self \\ (each+7) = 0 ifTrue: [^false]
].
^true
].
"Now 2, 3 and 5 do not divide self. So, self is of the form
30*k + {1, 7, 11, 13, 17, 19, 23, 29} for integer k >= 0.
The 31 case below is the 30k+1 case, excluding k = 0"
0 to: self sqrtFloor by: 30 do: [:each |
self \\ (each+7) = 0 ifTrue: [^false].
self \\ (each+11) = 0 ifTrue: [^false].
self \\ (each+13) = 0 ifTrue: [^false].
self \\ (each+17) = 0 ifTrue: [^false].
self \\ (each+19) = 0 ifTrue: [^false].
self \\ (each+23) = 0 ifTrue: [^false].
self \\ (each+29) = 0 ifTrue: [^false].
self \\ (each+31) = 0 ifTrue: [^false].
].
^true! !
More information about the Cuis-dev
mailing list