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
|