[squeak-dev] The Trunk: Kernel-ul.1192.mcz
leves at caesar.elte.hu
Thu Oct 25 16:34:17 UTC 2018
The ultimate tool for such use case is Integer >> #primesUpTo:(do:).
The code below is 3 times faster on my machine:
form := Form extent:8000 at 8000.
pen := Pen newOnForm: form.
pen goto: 100 at 6000.
pen turn: 90.
pen color: Color black.
previousPrime := nil.
Integer primesUpTo: 5000000 do: [ :prime |
previousPrime ifNotNil: [
go: prime - previousPrime;
turn: 90 ].
previousPrime := prime ].
form writePNGfileNamed: 'Sketch.png'
On Thu, 25 Oct 2018, karl ramberg wrote:
> Cool. I was just playing with some random crackpot ideas yesterday which involved primes.
> This fix made a nice speed up :-)
> diff := OrderedCollection new.
> singular := 2.
> 3 to: 5000000 do:[: i | i isPrime ifTrue:[ diff add: i - singular.
> singular := i]].
> form := Form extent:8000 at 8000.
> pen := Pen newOnForm: form.
> pen up.
> pen goto: 100 at 6000.
> pen down.
> pen turn: 90.
> pen color: Color black.
> diff do:[:i | pen go: i. pen turn: 90].
> form writePNGfileNamed: 'Sketch.png'
> On Wed, Oct 24, 2018 at 11:09 PM <commits at source.squeak.org> wrote:
> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
> ==================== Summary ====================
> Name: Kernel-ul.1192
> Author: ul
> Time: 24 October 2018, 10:50:43.875546 pm
> UUID: 72dfb776-3d77-4b84-9d69-d000e9a67ae1
> Ancestors: Kernel-eem.1191
> - improved Integer >> #isPrime's performance
> - slightly faster Categorizer >> #numberOfCategoryOfElement:
> =============== Diff against Kernel-eem.1191 ===============
> Item was changed:
> ----- Method: Categorizer>>numberOfCategoryOfElement: (in category 'accessing') -----
> numberOfCategoryOfElement: element
> "Answer the index of the category with which the argument, element, is
> + | categoryIndex elementIndex elementArraySize |
> - | categoryIndex elementIndex |
> categoryIndex := 1.
> elementIndex := 0.
> + elementArraySize := elementArray size.
> + [(elementIndex := elementIndex + 1) <= elementArraySize]
> - [(elementIndex := elementIndex + 1) <= elementArray size]
> ["point to correct category"
> [elementIndex > (categoryStops at: categoryIndex)]
> whileTrue: [categoryIndex := categoryIndex + 1].
> "see if this is element"
> element = (elementArray at: elementIndex) ifTrue: [^categoryIndex]].
> Item was changed:
> ----- Method: Integer>>isPrime (in category 'testing') -----
> "Answer true if the receiver is a prime number. See isProbablyPrime for a probabilistic
> implementation that is much faster for large integers, and that is correct to an extremely
> high statistical level of confidence (effectively deterministic)."
> + | probe step limit |
> + self <= 3 ifTrue: [ ^self >= 2 ].
> + self \\ 2 = 0 ifTrue: [ ^false ].
> + self \\ 3 = 0 ifTrue: [ ^false ].
> + self <= 1073741823 ifFalse: [ "1 << 30 - 1. For numbers larger than this (on 64-bit platforms) #isProbablyPrime is usually quicker."
> - self <= 1 ifTrue: [ ^false ].
> - self even ifTrue: [ ^self = 2].
> - self <= 1073741823 ifFalse: [ "1 << 30 - 1. For numbers larger than this, the calculation takes longer than #isProbablyPrime when the receiver is a prime. The absolue turning point
> is about at 1 << 35 - 1."
> ^self isProbablyPrime ].
> + probe := 5.
> + step := 2. "Step will oscillate between 2 and 4 because at this point self \\ 6 is either 1 or 5."
> + limit := self sqrtFloor. "On 64-bit platforms this could be written as self asFloat sqrt truncated (+ 1), which is faster because it creates no intermediate objects. Knowing that
> self has at most 30 bits because of the check above, this value will never be larger than 32767."
> + [ probe <= limit ] whileTrue: [
> + self \\ probe = 0 ifTrue: [ ^false ].
> + probe := probe + step.
> + step := 6 - step ].
> - 3 to: self sqrtFloor by: 2 do: [ :each |
> - self \\ each = 0 ifTrue: [ ^false ] ].
> Item was added:
> + ----- Method: LargeNegativeInteger>>isPrime (in category 'testing') -----
> + isPrime
> + ^false!
More information about the Squeak-dev