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