From ba61150cd095c4b977c51bda62c24b2cc69a19f5 Mon Sep 17 00:00:00 2001 From: Christoph Fuerst <ch.fuerst@gmx.at> Date: Wed, 19 Apr 2017 22:07:01 +0200 Subject: [PATCH] Updates after Review Wolfgang --- sieveEratosthenes.txt | 52 ++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/sieveEratosthenes.txt b/sieveEratosthenes.txt index 11a16ce..6b27a8a 100644 --- a/sieveEratosthenes.txt +++ b/sieveEratosthenes.txt @@ -3,8 +3,7 @@ val MAX: â; type nat = â[MAX]; pred divides(m:nat,n:nat) â âp:nat. mâ p = n; -pred isPrime(m:nat) â (m = 0) ⨠(m=1) ⨠- (1 < m ⧠ân:nat. divides(n,m) â (nâ¤1 ⨠n=m)); +pred isPrime(m:nat) â m > 1 ⧠ân:nat. n>1 ⧠divides(n,m) â (n = m); proc IntegerRoot(a:nat): nat ensures result^2 ⤠a ⧠a < (result+1)^2; @@ -25,34 +24,33 @@ proc IntegerRoot(a:nat): nat proc SieveOfErathostenes(m:nat): Array[MAX,Bool] - requires m>1; - ensures âp:nat. ((p < m ⧠result[p]=true) â isPrime(p)); + ensures âp:nat with p < m. (result[p]=true â isPrime(p)); { var ret:Array[MAX,Bool] := Array[MAX,Bool](true); - var i:nat; - var k:nat = 0; - var j:nat; + ret[0] = false; ret[1] = false; - for i=2; iâ¤IntegerRoot(m); i=i+1 do - decreases IntegerRoot(m)+1-i; + for var i:nat=2; iâ¤IntegerRoot(m); i=i+1 do + invariant (ret[i] = true) ⨠(âj:nat. 1 < j ⧠j < i ⧠divides(j,i)); + decreases IntegerRoot(m)+2-i; { if ret[i] = true then { - for k=0;i^2+k*i<MAX;k=k+1 do + for var k:nat=0;i^2+k*i<MAX;k=k+1 do + invariant âl:nat. (l<k ⧠i^2+l*i < MAX) â (ret[i^2+l*i] = false); + decreases MAX+2 - (i^2 + k*i); { - j=i^2+k*i; - ret[j] = false; + ret[i^2+k*i] = false; } } } return ret; } -proc SetMin(s:Set[â[MAX]]): â[MAX] - requires s â â [â[MAX]]; - ensures âe â s. result ⤠e; +proc SetMin(s:Set[nat]): nat + requires s â â [nat]; + ensures result â s ⧠âe â s. result ⤠e; { - var ret:â[MAX] := MAX; + var ret:nat := MAX; for x in s do { @@ -64,21 +62,25 @@ proc SetMin(s:Set[â[MAX]]): â[MAX] return ret; } -proc SieveOfErathostenesSet(m:â[MAX]): Set[â[MAX]] - requires m>1; - ensures âe â result. isPrime(e); +fun SetMin2(s:Set[nat]): nat + requires s â â [nat]; + ensures result â s ⧠âe â s. result ⤠e; + = choose m in s with âe in s. m <= e; + +proc SieveOfErathostenesSet(m:nat): Set[nat] + ensures âe:nat. e ⤠m â (e â result â isPrime(e)); { - var start:Set[â[MAX]] := 2..m; - var ret:Set[â[MAX]] := â [â[MAX]]; - var locmi:â[MAX]; + var start:Set[nat] := 2..m; + var ret:Set[nat] := â [nat]; - while start â â [â[MAX]] do - invariant âe â ret. isPrime(e); + while start â â [nat] do + invariant ret â 2..m ⧠âe â ret. isPrime(e); { - locmi = SetMin(start); + var locmi:nat = SetMin(start); ret = ret ⪠{locmi}; start = start \ ({locmi} ⪠{ if divides(locmi,x) then x else locmi | x â start}); } return ret; } + -- 2.1.4