[squeak-dev] The Trunk: Kernel-ul.1192.mcz
karl ramberg
karlramberg at gmail.com
Thu Oct 25 08:05:59 UTC 2018
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'
Cheers,
Karl
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:
> http://source.squeak.org/trunk/Kernel-ul.1192.mcz
>
> ==================== 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
> associated."
>
> + | categoryIndex elementIndex elementArraySize |
> - | categoryIndex elementIndex |
> categoryIndex := 1.
> elementIndex := 0.
> + elementArraySize := elementArray size.
> + [(elementIndex := elementIndex + 1) <= elementArraySize]
> - [(elementIndex := elementIndex + 1) <= elementArray size]
> whileTrue:
> ["point to correct category"
> [elementIndex > (categoryStops at: categoryIndex)]
> whileTrue: [categoryIndex := categoryIndex
> + 1].
> "see if this is element"
> element = (elementArray at: elementIndex) ifTrue:
> [^categoryIndex]].
> ^0!
>
> Item was changed:
> ----- Method: Integer>>isPrime (in category 'testing') -----
> isPrime
> "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 ] ].
> ^true!
>
> Item was added:
> + ----- Method: LargeNegativeInteger>>isPrime (in category 'testing') -----
> + isPrime
> +
> + ^false!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20181025/9bf1c08c/attachment.html>
More information about the Squeak-dev
mailing list
|