New Member

Hacker mrandycs at swbell.net
Mon Jul 23 23:21:15 UTC 2001


Hi Smalltalkers,
This is my first post on your list. Here's some Integer methods I wrote.
Enjoy, Randy

'From Squeak3.0 of 4 February 2001 [latest update: #3545] on 23 July 2001 at
5:51:06 pm'!



!Integer methodsFor: 'prime numbers' stamp: 'rtm 7/23/2001 12:31'!

isPrime

"Return true/false. Is the receiver a prime number?

Example: 123456791 isPrime "

| selfSqrt divisor addendArray indexArray index |

(self < 2) ifTrue: [self error: 'Receiver must be an Integer >= 2'. ^nil].

"The following two arrays are used to generate the divisor sequence:

2,3,5,7,9,11,13,17,19,21,23,27,... i.e., after divide checking by 2,3, and
5, we

only divide check by the odd numbers greater than 5, which do not end in 5."

addendArray := #( 1 2 2 2 2 2 4 ).

indexArray := #( 2 3 4 5 6 7 4 ).

index := 1.

divisor := 2. selfSqrt := self sqrt.

[divisor > selfSqrt]

whileFalse: [

(self \\ divisor) = 0 "modulus, remainder division"

ifTrue: ["the divisor is a factor of factor"

^false

]

ifFalse: ["the divisor is not a factor of factor"

divisor := divisor + (addendArray at: index).

index := indexArray at: index.

].

].

^true! !

!Integer methodsFor: 'prime numbers' stamp: 'rtm 7/23/2001 17:50'!

primeFactors

"Return an Array of Integers containing the

prime factors of the receiver.

Example: 1234567890 primeFactors "

| col factor divisor addendArray indexArray index |

(self < 2) ifTrue: [self error: 'Receiver must be an Integer >= 2'. ^nil].

"The following two arrays are used to generate the divisor sequence:

2,3,5,7,9,11,13,17,19,21,23,27,... i.e., after divide checking by 2,3, and
5, we

only divide check by the odd numbers greater than 5, which do not end in 5."

addendArray := #( 1 2 2 2 2 2 4 ).

indexArray := #( 2 3 4 5 6 7 4 ).

index := 1.

col := OrderedCollection new.

factor := self. divisor := 2.

[divisor > (factor sqrt)]

whileFalse: [

(factor \\ divisor) = 0 "modulus, remainder division"

ifTrue: ["the divisor is a prime factor of factor"

col add: divisor.

factor := factor // divisor "integer division"

]

ifFalse: ["the divisor is not a prime factor of factor"

divisor := divisor + (addendArray at: index).

index := indexArray at: index.

].

].

col add: factor.

^col asArray! !

!Integer methodsFor: 'prime numbers' stamp: 'rtm 7/23/2001 12:21'!

primesTo: anInteger

"Return an Array of Integers containing the prime numbers

ranging from the receiver to anInteger.

Example: 12345000 primesTo: 12346000 "

| col |

(self < 2)

ifTrue: [self error: 'Receiver must be an Integer >= 2'. ^nil ].

(anInteger isKindOf: Integer)

ifTrue: [

(anInteger < self)

ifTrue: [self error: 'Argument must be >= receiver'. ^nil ].]

ifFalse: [self error: 'Argument must be an Integer'. ^nil ].

col := OrderedCollection new.

self to: anInteger do: [ :num |

num isPrime

ifTrue: [col add: num].

]. ^col asArray! !






More information about the Squeak-dev mailing list