[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