3 This is a variant of Eratosthenes's sieve with complexity O(N),
4 where N is the upper limit of the sieve.
5 Cf https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Euler's_sieve
7 Euler's Sieve makes use of a linked list of all integers,
8 and marks composite numbers as in Eratosthenes's sieve.
10 In the program below, the linked list is implemented with an array
11 (where each integer is mapped to the next one) and negative values
12 are used to represent marked integers.
13 In addition, the list only contains the odd integers (to save half
16 Author: Josué Moreau (Université Paris-Saclay)
19 module ArithmeticResults
22 use number.Divisibility
24 use int.EuclideanDivision
26 let lemma mult_croissance_locale (n a: int)
27 requires { n > 0 /\ 0 <= a }
28 ensures { n * a < n * (a + 1) } = ()
30 let rec lemma mult_croissance (n a b: int)
31 requires { n > 0 /\ 0 <= a < b }
32 ensures { n * a < n * b }
34 = if a + 1 = b then ()
35 else mult_croissance n (a + 1) b
37 let lemma comp_mult_2 (n k: int)
38 requires { n > 0 /\ k >= 2 }
39 ensures { n * k >= n * 2 } = ()
41 let lemma div_croissance_locale1 (i n: int)
42 requires { 0 <= i /\ n > 0 }
43 ensures { div i n <= div (i + 1) n } = ()
45 let rec lemma div_croissance1 (i j n: int)
46 requires { 0 <= i <= j /\ n > 0 }
47 ensures { div i n <= div j n }
50 div_croissance1 i (j - 1) n
52 let rec lemma div_croissance_locale2 (m i: int)
53 requires { i > 0 /\ m >= 0 }
54 ensures { div m (i + 1) <= div m i }
56 = if m > 0 then div_croissance_locale2 (m - 1) i
58 let rec lemma div_croissance2 (m i j: int)
59 requires { 0 < i <= j /\ m >= 0 }
60 ensures { div m i >= div m j }
62 = if i < j then div_croissance2 m i (j - 1)
64 let lemma div_mult_1 (n k max: int)
65 requires { n > 0 /\ max >= n /\ n * k <= max }
66 ensures { k = div (n * k) n <= div max n } = ()
68 let lemma mult_borne_sous_exp (n a b: int)
69 requires { a >= 1 /\ b >= 1 /\ n >= 1 /\ a * b < n }
70 ensures { a < n /\ b < n } = ()
72 let rec lemma sq_ineq (a b: int)
73 requires { a >= 0 /\ b >= 0 }
74 requires { a * a < b * b }
76 variant { b * b - a * a }
77 = if (b - 1) * (b - 1) > a * a then
82 module DivisibilityResults
85 use int.EuclideanDivision
86 use number.Divisibility
89 let lemma divides_div (n m k: int)
90 requires { 2 <= n /\ 2 <= m /\ 2 <= k < n /\ divides n m /\ not divides k m }
91 ensures { not divides k (div m n) } = ()
93 let lemma divides_inf (n m: int)
94 requires { 2 <= n /\ 2 <= m /\ divides n m /\
95 forall k. 2 <= k < n -> not divides k m }
96 ensures { forall k. 2 <= k < n -> not divides k (div m n) } = ()
98 let lemma not_prime_divider_limits (n: int)
99 requires { not prime n /\ 2 <= n }
100 ensures { exists i. 2 <= i /\ i * i <= n /\ divides i n } = ()
102 let lemma no_prod_impl_no_divider (n: int)
106 not (exists k l. 2 <= k < n /\ 2 <= l < i /\ k * l = i ) ->
107 not (exists k. 2 <= k < n /\ k <> i /\ divides k i) } = ()
109 use ArithmeticResults
111 let lemma not_prime_impl_divisor_under_sqrt (n: int)
116 exists j. 2 <= j < i /\ ((j < n)
117 by j * j < n * n /\ j >= 0) /\ divides j i } = ()
121 module EulerSieveSpec
124 use number.Divisibility
127 use int.EuclideanDivision
129 use ArithmeticResults
130 use DivisibilityResults
133 (*******************************************************************************)
135 (* INVARIANTS SUR LES RELATIONS ENTRE STRUCTURES DE DONNEES *)
137 (*******************************************************************************)
139 (* Borne sur le suivant de chaque élément de la liste chaînée *)
140 predicate inv_nexts (nexts: seq int) (n: int) =
141 forall i. 0 <= i < n ->
144 (* Tous les éléments éliminés de la liste chaînée sont marqués *)
145 predicate all_eliminated_marked (marked: seq bool)
147 marked.length = nexts.length /\
148 forall i. 0 <= i < marked.length ->
149 forall j. i < j < nexts[i] ->
152 (* Tous les éléments éliminés, à partir d'un certain indice, sont marqués *)
153 predicate all_eliminated_marked_partial (marked: seq bool)
156 marked.length = nexts.length /\
157 forall i. min <= i < marked.length ->
158 forall j. i < j < nexts[i] ->
161 (* L'élément suivant d'un élément non marqué inférieur à max / n est
162 non marqué lorsqu'il est lui-même inférieur à max / n *)
163 predicate not_marked_impl_next_not_marked (marked_old: seq bool)
166 marked_old.length = nexts.length /\
167 marked_old.length >= 2 /\
169 forall i. 2 <= i <= div (marked_old.length - 1) n ->
170 nexts[i] <= div (marked_old.length - 1) n ->
172 not marked_old[nexts[i]]
174 (* Les deux tableaux marked sont identiques *)
175 predicate is_copy (marked: seq bool)
176 (marked_old: seq bool) =
177 marked.length = marked_old.length /\
178 forall i. 0 <= i < marked.length ->
182 (* L'élément suivant d'un élément non marqué inférieur à p <= max / n est
183 non marqué lorsqu'il est inférieur à max / n *)
184 predicate not_marked_impl_next_not_marked_partial (marked: seq bool)
188 marked.length = nexts.length /\
189 marked.length >= 2 /\
191 p <= div (marked.length - 1) n /\
192 forall i. 2 <= i < p ->
193 nexts[i] <= div (marked.length - 1) n ->
198 (*******************************************************************************)
200 (* PROPRIETES LIEES AUX NOMBRES PREMIERS *)
202 (*******************************************************************************)
204 (* Tous les nombres jusqu'à n sont non marqués si et seulement si ils sont
206 predicate all_primes (marked: seq bool) (n: int) =
207 forall i. 0 <= i < n -> not marked[i] <-> prime i
209 (* Tous les multiples de i sont marqués *)
210 predicate all_multiples_marked (marked: seq bool) (i max: int) =
211 2 <= i < marked.length /\
212 forall k. 2 <= k < max ->
213 i * k < marked.length ->
216 (* Tous les multiples des 2 <= i < n sont marqués *)
217 predicate previously_marked_multiples (marked: seq bool) (n: int) =
218 forall i. 2 <= i < n ->
219 all_multiples_marked marked i marked.length
221 (* Les multiples des 2 <= i < n sont les uniques nombres marqués *)
222 predicate only_multiples_marked (marked: seq bool) (n: int) =
223 forall k. 2 <= k < marked.length ->
225 exists i j. 2 <= i < n /\ 2 <= j < marked.length /\ i * j = k
227 (* Les multiples de n avec les éléments non marqués précédement sont
229 predicate prime_multiples_marked (marked_old: seq bool)
232 marked_old.length = marked.length /\
233 n < max <= marked.length /\
234 forall i. n <= i < max ->
236 n * i < marked_old.length ->
239 (* Invariants de base de remove_products *)
240 predicate inv_remove_products (nexts: seq int)
243 nexts.length = marked.length /\
245 all_primes marked n /\
248 inv_nexts nexts nexts.length
251 (*******************************************************************************)
253 (* QUELQUES LEMMES DE CONSERVATION DES STRUCTURES *)
255 (*******************************************************************************)
257 let lemma conservation_all_eliminated_marked_on_marked_change
261 requires { marked.length = nexts.length }
262 requires { inv_nexts nexts nexts.length }
263 requires { all_eliminated_marked marked nexts }
264 requires { 0 <= i < marked.length }
265 ensures { all_eliminated_marked marked[i <- true] nexts } = ()
267 let lemma conservation_all_eliminated_marked_on_nexts_change
271 requires { marked.length = nexts.length }
272 requires { all_eliminated_marked marked nexts }
273 requires { inv_nexts nexts marked.length }
274 requires { 0 <= i < marked.length }
275 requires { i < v <= marked.length }
276 requires { forall j. i < j < v -> marked[j] }
277 ensures { all_eliminated_marked marked nexts[i <- v] } = ()
279 (*******************************************************************************)
281 (* QUELQUES PREDICATS UTILES *)
283 (*******************************************************************************)
285 predicate ordered (a: seq int) (n: int) =
286 forall i j. 0 <= i < j < n -> a[i] < a[j]
288 predicate all_inf_or_eq (a: seq int) (n k: int) =
289 forall i. 0 <= i < n -> a[i] <= k
296 use number.Divisibility
299 use int.EuclideanDivision
301 use ArithmeticResults
302 use DivisibilityResults
306 (*******************************************************************************)
308 (* PROPRIETES LIEES AUX NOMBRES PREMIERS *)
310 (*******************************************************************************)
312 (* Si tous les multiples des nombres i < n sont marqués,
313 alors les mutliples de ces multiples sont marqués *)
314 let lemma multiples_of_marked_are_marked (marked: seq bool) (n: int)
315 requires { 2 <= n <= marked.length }
316 requires { previously_marked_multiples marked n }
317 ensures { forall k i.
319 2 <= i < marked.length ->
320 k * i < marked.length ->
322 1 <= j < marked.length ->
323 k * i * j < marked.length ->
325 by 1 <= i * j < marked.length
326 by k >= 2 /\ i >= 2 /\ j >= 1 /\ k * (i * j) < marked.length) }
329 (* Lemme essentiel : si tous les multiples des nombres i < n sont marqués
330 et qu'on a marqué tous les produits de n avec les nombres
332 alors tous les multiples de n sont marqués *)
333 let lemma prev_and_new_impl_all_multiples_marked
334 (marked_old marked: seq bool)
336 requires { 2 <= n < marked.length /\ 2 <= max < marked.length /\
337 marked_old.length = marked.length }
338 requires { is_copy marked marked_old }
339 requires { previously_marked_multiples marked_old n }
340 requires { previously_marked_multiples marked n }
341 requires { only_multiples_marked marked_old n }
342 requires { prime_multiples_marked marked_old marked n marked.length }
343 ensures { all_multiples_marked marked n marked.length } =
344 assert { forall i. 2 <= i < n /\ 2 <= i < marked.length ->
346 i * n < marked.length ->
348 assert { forall k. 2 <= k < marked_old.length ->
350 n * k < marked_old.length ->
351 exists i j. 2 <= i < n /\ 2 <= j < marked_old.length /\
352 i * j = k /\ marked_old[i * j] };
353 multiples_of_marked_are_marked marked_old n;
354 multiples_of_marked_are_marked marked n;
355 assert { marked.length = marked_old.length };
356 assert { forall k. 2 <= k < marked_old.length ->
358 n * k < marked_old.length ->
360 by forall k. 2 <= k < marked_old.length ->
362 n * k < marked_old.length ->
364 assert { prime_multiples_marked marked_old marked n marked.length };
365 assert { (forall k. 2 <= k < marked.length ->
366 not marked_old[k] -> n * k < marked.length ->
369 (*******************************************************************************)
371 (* LEMMES DE CONSERVATION LIES AUX NOMBRES PREMIERS *)
373 (*******************************************************************************)
375 let lemma conservation_only_multiples_marked (marked: seq bool) (n i j: int)
376 requires { 2 <= i < n /\ 2 <= j < marked.length /\ i * j < marked.length }
377 requires { only_multiples_marked marked n }
378 ensures { only_multiples_marked marked[(i * j) <- true] n } =
379 assert { forall k. 0 <= k < marked.length ->
381 marked[(i * j) <- true][k] = marked[k] };
383 2 <= k < marked.length ->
385 marked[(i * j) <- true][k] ->
386 exists x y. 2 <= x < n /\ 2 <= y < marked.length /\ k = x * y };
387 assert { marked[i * j] -> 2 <= i < n -> 2 <= j < marked.length ->
388 exists x y. 2 <= x < n /\ 2 <= y < marked.length /\ x * y = i * j }
390 let lemma conservation_previously_marked_multiples (marked: seq bool)
393 requires { 2 <= n < marked.length /\ marked.length = nexts.length /\
394 nexts[n] <= marked.length }
395 requires { previously_marked_multiples marked n }
396 requires { only_multiples_marked marked (n + 1) }
397 requires { all_eliminated_marked marked nexts }
398 requires { not_marked_impl_next_not_marked marked nexts nexts[n] }
399 requires { all_multiples_marked marked n marked.length }
400 ensures { previously_marked_multiples marked nexts[n] } =
401 assert { previously_marked_multiples marked (n + 1) };
402 assert { forall i. n < i < nexts[n] -> marked[i] };
403 assert { forall i. n < i < nexts[n] ->
404 ((exists k l. 2 <= k <= n /\ 2 <= l < marked.length /\ k * l = i)
406 multiples_of_marked_are_marked marked (n + 1);
409 2 <= j < marked.length ->
410 i * j < marked.length ->
412 by (exists k l. 2 <= k <= n /\ 2 <= l < marked.length /\ k * l = i)) };
415 all_multiples_marked marked i marked.length }
417 lemma conservation_previously_marked_multiples_on_marked_change:
419 previously_marked_multiples marked n ->
420 forall i. 0 <= i < marked.length ->
421 previously_marked_multiples marked[i <- true] n
423 (*******************************************************************************)
425 (* INVARIANTS SIMPLES DE FONCTIONS *)
427 (*******************************************************************************)
429 let lemma conservation_not_marked_impl_next_not_marked
433 requires { not_marked_impl_next_not_marked marked nexts n /\
435 div max nexts[n] <= div max n
436 by forall i. p < i < nexts[p] -> marked[i] /\
437 not_marked_impl_next_not_marked_partial marked nexts n p }
438 ensures { not_marked_impl_next_not_marked marked nexts nexts[n] } = ()
440 let lemma unchanged_other_elements (s1: seq 'a) (s2: seq 'a) (i: int) (v: 'a)
441 requires { 0 <= i < length s1 /\ length s1 = length s2 }
442 requires { s1 = s2[i <- v] }
443 ensures { forall j. 0 <= j < length s1 -> i <> j -> s1[j] = s2[j] } = ()
445 (*******************************************************************************)
447 (* DEFINITION DE LA STRUCTURE DE DONNEE ABSTRAITE *)
449 (*******************************************************************************)
454 mutable ghost nexts: seq int;
455 mutable ghost marked: seq bool;
458 invariant { max_int > max >= 3 }
459 invariant { nexts.length = marked.length = max + 1 }
460 invariant { inv_nexts nexts nexts.length }
461 invariant { all_eliminated_marked marked nexts }
462 invariant { forall i. 3 <= i <= max -> mod i 2 = 0 -> marked[i] }
463 invariant { forall i. 3 <= i < max - 1 ->
465 mod (Seq.get nexts i) 2 = 1 \/ Seq.get nexts i = max + 1 }
466 invariant { Seq.get nexts max = max + 1 /\
467 (mod (max - 1) 2 = 0 -> Seq.get nexts (max - 1) = max) /\
468 (mod (max - 1) 2 = 1 -> Seq.get nexts (max - 1) = max + 1) }
470 by { nexts = Seq.create 4 (fun i -> i + 1);
471 marked = Seq.create 4 (fun i -> i < 2);
474 val create (max: int63) : t
475 requires { max_int > max >= 3 }
476 ensures { result.max = max }
477 ensures { Seq.get result.marked 0 = Seq.get result.marked 1 = true /\
478 not Seq.get result.marked 2 }
479 ensures { forall i. 3 <= i <= max ->
480 mod i 2 = 0 <-> Seq.get result.marked i }
481 ensures { forall i. 3 <= i < max - 1 ->
482 mod i 2 = 0 -> Seq.get result.nexts i = i + 1 }
483 ensures { forall i. 3 <= i < max - 1 ->
484 mod i 2 = 1 -> Seq.get result.nexts i = i + 2 }
485 ensures { forall i. 0 <= i <= max ->
486 Seq.get result.marked i -> i < 2 \/ divides 2 i }
488 val set_next (t: t) (i v: int63) : unit
489 requires { 0 <= i <= t.max /\ i < v <= t.max + 1 }
490 requires { mod i 2 = 1 }
491 requires { forall j. i < j < v -> Seq.get t.marked j }
492 requires { not Seq.get t.marked i }
493 requires { mod v 2 = 1 \/ v = t.max + 1 }
495 ensures { t.nexts = (old t.nexts)[i <- v] }
497 val get_next (t: t) (i: int63) : int63
498 requires { 3 <= i <= t.max }
499 requires { mod i 2 = 1 }
500 ensures { 3 <= result <= t.max + 1 }
501 ensures { result = t.nexts[i] }
502 ensures { mod result 2 = 1 \/ result = t.max + 1 }
504 val set_mark (t: t) (i: int63) : unit
505 requires { 0 <= i <= t.max }
506 requires { mod i 2 = 1 }
508 ensures { t.marked = (old t.marked)[i <- true] }
510 val get_mark (t: t) (i: int63) : bool
511 requires { 0 <= i <= t.max }
512 requires { mod i 2 = 1 }
513 ensures { result = t.marked[i] }
515 val get_max (t: t) : int63
516 ensures { result = t.max /\ result >= 2 }
518 (*******************************************************************************)
520 (* PREUVE DE REMOVE_PRODUCTS DANS LA STRUCTURE DE DONNEE ABSTRAITE *)
522 (*******************************************************************************)
524 let remove_products (t: t) (n: int63) : unit
525 requires { 3 <= n <= t.max /\ n * n <= t.max }
526 requires { inv_remove_products t.nexts t.marked n }
527 requires { previously_marked_multiples t.marked n }
528 requires { only_multiples_marked t.marked n }
529 requires { not_marked_impl_next_not_marked t.marked t.nexts n }
530 ensures { inv_remove_products t.nexts t.marked n }
531 ensures { not_marked_impl_next_not_marked t.marked t.nexts t.nexts[n] }
532 ensures { previously_marked_multiples t.marked t.nexts[n] }
533 ensures { only_multiples_marked t.marked t.nexts[n] }
534 = let d = get_max t / n in
535 let ghost max = t.max in
536 let ghost marked_old = t.marked in
537 let rec loop (p: int63) (ghost x: int) =
538 requires { n <= p <= max /\ 3 <= n <= max /\ mod p 2 = 1 /\
539 p <= x < t.nexts[p] /\ t.nexts[x] = t.nexts[p] /\
541 requires { inv_remove_products t.nexts t.marked n }
542 requires { previously_marked_multiples t.marked n }
543 requires { not t.marked[p] }
544 requires { is_copy t.marked marked_old }
545 requires { all_eliminated_marked_partial marked_old t.nexts x }
546 requires { not_marked_impl_next_not_marked marked_old t.nexts n }
547 requires { prime_multiples_marked marked_old t.marked n t.nexts[x] }
548 requires { not_marked_impl_next_not_marked_partial t.marked t.nexts n p }
549 requires { only_multiples_marked t.marked (n + 1) }
550 ensures { inv_remove_products t.nexts t.marked n }
551 ensures { not_marked_impl_next_not_marked t.marked t.nexts t.nexts[n] }
552 ensures { is_copy t.marked marked_old }
553 ensures { previously_marked_multiples t.marked n }
554 ensures { prime_multiples_marked marked_old t.marked n t.marked.length }
555 ensures { only_multiples_marked t.marked (n + 1) }
556 variant { max - t.nexts[p] }
557 let next = get_next t p in
558 if 0 <= next <= get_max t then
559 if next <= d then begin
560 assert { n * next <= max by n * next <= n * d by next <= d };
561 ghost (conservation_only_multiples_marked t.marked (to_int n + 1)
562 (to_int n) t.nexts[to_int p]);
563 let ghost marked_copy = t.marked in
564 set_mark t (n * next);
565 unchanged_other_elements t.marked marked_copy
566 (to_int n * to_int next) true;
567 assert { p < 2 * p < 2 * t.nexts[p] <= n * t.nexts[p] = n * next };
568 assert { not t.marked[p] by n * next > p /\ p <= length t.marked };
569 assert { not marked_old[t.nexts[p]] by 2 <= p < next <= div max n };
570 assert { prime_multiples_marked marked_old t.marked n t.nexts[next]
571 by prime_multiples_marked marked_old t.marked n t.nexts[x] };
572 assert { forall i. 0 <= i < p -> t.nexts[i] <= p
573 by forall i. 0 <= i < p ->
574 forall j. i < j < t.nexts[i] -> t.marked[j] };
575 if get_mark t next then begin
576 assert { t.nexts[p] <> t.marked.length };
577 let ghost nexts_copy = t.nexts in
578 set_next t p (get_next t next);
579 unchanged_other_elements t.nexts nexts_copy (to_int p)
580 nexts_copy[to_int next];
581 assert { all_eliminated_marked_partial marked_old t.nexts next
583 forall j. next <= j < length t.nexts ->
584 t.nexts[j] = nexts_copy[j] };
587 assert { forall i. p < i < t.nexts[p] -> t.marked[i] };
588 loop next (to_int next)
591 assert { n * next > max
592 by n * (div max n + 1) > max >= n * div max n /\
593 n * next >= n * (d + 1) by next >= d + 1 };
594 ghost (conservation_not_marked_impl_next_not_marked t.marked t.nexts
595 (to_int max) (to_int n) (to_int p))
597 ghost (conservation_not_marked_impl_next_not_marked t.marked t.nexts
598 (to_int max) (to_int n) (to_int p)) in
599 ghost (conservation_only_multiples_marked t.marked (to_int n + 1)
600 (to_int n) (to_int n));
601 let ghost marked_copy = t.marked in
603 unchanged_other_elements t.marked marked_copy (to_int n * to_int n) true;
604 assert { forall i. 0 <= i < n -> t.nexts[i] <> n * n
605 by forall i. 0 <= i < n -> t.nexts[i] <= n < n * n
606 by not t.marked[n] /\
607 forall i. 0 <= i < n ->
608 forall j. i < j < t.nexts[i] -> t.marked[j] };
610 ghost (prev_and_new_impl_all_multiples_marked marked_old t.marked
611 (to_int n) (to_int max));
612 ghost (conservation_previously_marked_multiples t.marked t.nexts
615 (*******************************************************************************)
617 (* QUELQUES LEMMES NECESSAIRES A LA SUITE DE LA PREUVE *)
619 (*******************************************************************************)
621 let lemma previously_marked_multiples_impl_prime (marked: seq bool) (n: int)
622 requires { 2 <= n < marked.length /\ not marked[n] }
623 requires { previously_marked_multiples marked n }
624 ensures { prime n } =
626 2 <= k < n -> not divides k n
629 not (exists i. 2 <= i < marked.length /\ n = k * i) }
631 let lemma only_multiples_marked_impl_not_marked (marked: seq bool)
634 requires { 2 <= n < marked.length }
635 requires { only_multiples_marked marked nexts[n] }
637 ensures { not marked[n] } =
638 assert { forall i j. 2 <= i < n -> 2 <= j < marked.length -> i * j <> n }
642 module EulerSieveImpl
647 use mach.array.ArrayInt63
650 use int.EuclideanDivision
651 use number.Divisibility
654 use DivisibilityResults
657 (*******************************************************************************)
659 (* LEMMES DE CONSERVATION LIES A L'IMPLEMENTATION *)
661 (*******************************************************************************)
663 let lemma conservation_inv_arr_on_mark (arr: seq int) (i: int)
664 requires { forall j k. 0 <= j < length arr ->
665 j < k < div (abs arr[j]) 2 -> arr[k] < 0 }
666 requires { forall i. 0 <= i < length arr ->
667 i < div (abs arr[i]) 2 <= length arr }
668 requires { 0 <= i < length arr }
669 requires { arr[i] >= 0 }
670 ensures { forall j k. 0 <= j < length arr ->
671 j < k < div (abs arr[i <- - arr[i]][j]) 2 ->
672 arr[i <- - arr[i]][k] < 0 } =
673 assert { forall j. 0 <= j < length arr ->
674 arr[j] < i -> arr[j] = arr[i <- - arr[i]][j] };
675 assert { forall j. 0 <= j < length arr ->
676 arr[i] < j -> arr[j] = arr[i <- - arr[i]][j] }
678 let lemma conservation_inv_arr_on_jump (arr: seq int) (min i: int)
679 requires { min >= 0 }
680 requires { forall j k. min <= j < length arr ->
681 j < k < div (abs arr[j]) 2 -> arr[k] < 0 }
682 requires { forall i. min <= i < length arr ->
683 i < div (abs arr[i]) 2 <= length arr }
684 requires { min <= i < length arr }
685 requires { 0 <= div arr[i] 2 < length arr }
686 requires { arr[div arr[i] 2] < 0 }
687 ensures { forall j k. min <= j < length arr ->
688 j < k < div (abs arr[i <- - arr[div arr[i] 2]][j]) 2 ->
689 arr[i <- - arr[div arr[i] 2]][k] < 0 } =
690 let ghost next = div (Seq.get arr i) 2 in
691 let ghost arr1 = arr[i <- - Seq.get arr next] in
692 assert { forall j. min <= j < i -> arr[j] = arr1[j] };
693 assert { forall j. i < j < length arr -> arr[j] = arr1[j] }
695 (*******************************************************************************)
697 (* DEFINITION DE L'IMPLEMENTATION DE LA STRUCTURE DE DONNEE *)
699 (*******************************************************************************)
702 mutable ghost nexts: seq int;
703 mutable ghost marked: seq bool;
708 invariant { max_int > max >= 3 }
709 invariant { Seq.length nexts = Seq.length marked = max + 1 }
710 invariant { div (max - 1) 2 = max_arr }
711 invariant { length arr = max_arr + 1 }
712 invariant { inv_nexts nexts (Seq.length nexts) }
713 invariant { all_eliminated_marked marked nexts }
714 invariant { forall i. 3 <= i <= max -> mod i 2 = 0 -> Seq.get marked i }
715 invariant { forall i. 3 <= i < max - 1 ->
717 mod (Seq.get nexts i) 2 = 1 \/ Seq.get nexts i = max + 1 }
718 invariant { Seq.get nexts max = max + 1 /\
719 (mod (max - 1) 2 = 0 -> Seq.get nexts (max - 1) = max) /\
720 (mod (max - 1) 2 = 1 -> Seq.get nexts (max - 1) = max + 1) }
721 (* glueing invariant *)
722 invariant { forall i. 0 <= i <= max_arr -> -(max + 1) <= arr[i] <= max + 1 }
723 invariant { forall i. 0 <= i <= max_arr ->
724 Seq.get marked (2 * i + 1) <-> arr[i] < 0 }
725 invariant { forall i. 0 <= i <= max_arr ->
726 not Seq.get marked (2 * i + 1) ->
727 arr[i] = Seq.get nexts (2 * i + 1) }
728 invariant { forall i. 0 <= i <= max_arr ->
729 Seq.get marked (2 * i + 1) ->
730 arr[i] = - Seq.get nexts (2 * i + 1) }
731 invariant { forall i. 0 <= i <= max_arr ->
732 i < div (abs arr[i]) 2 <= max_arr + 1 /\
733 abs arr[i] <= max + 1 }
734 invariant { forall i j. 0 <= i <= max_arr ->
735 i < j < div (abs arr[i]) 2 -> arr[j] < 0 }
736 by { nexts = Seq.create 4 (fun i -> i + 1);
737 marked = Seq.create 4 (fun i -> i < 2);
738 arr = ArrayInt63.set (ArrayInt63.make 2 (-2)) 1 4;
739 max = 3; max_arr = 1 }
741 let create (max: int63) : t
742 requires { max_int > max >= 3 }
743 ensures { result.max = max }
744 ensures { Seq.get result.marked 0 = Seq.get result.marked 1 = true /\
745 not Seq.get result.marked 2 }
746 ensures { forall i. 1 <= i <= div (max - 1) 2 ->
747 not Seq.get result.marked (2 * i + 1) }
748 ensures { forall i. 2 <= i <= div (max + 1) 2 ->
750 Seq.get result.marked (2 * i) }
751 ensures { forall i. 1 <= i <= div (max - 1) 2 ->
752 2 * i + 1 < max - 1 ->
753 Seq.get result.nexts (2 * i + 1) = 2 * i + 3 }
754 ensures { forall i. 2 <= i <= div (max - 1) 2 ->
756 Seq.get result.nexts (2 * i) = 2 * i + 1 }
757 ensures { forall i. 0 <= i <= max ->
758 Seq.get result.marked i -> i < 2 \/ divides 2 i }
759 = let ghost len = pure { max + 1 } in
760 let len_arr = (max - 1) / 2 + 1 in
761 let ghost nexts = Seq.create len (pure { fun (i: int) ->
762 if i = max then max + 1
763 else if i = max - 1 then if mod i 2 = 0 then max else max + 1
764 else if i < 3 || mod i 2 = 0 then i + 1
766 let ghost marked = Seq.create len (fun i ->
767 i = 0 || i = 1 || (i > 2 && mod i 2 = 0)) in
768 let ghost f = pure { fun i -> if i = len_arr - 1 then max + 1
769 else if i = 0 then -2
771 let arr = ArrayInt63.make len_arr (-2) in
772 for i = 1 to len_arr - 1 do
773 invariant { forall j. 0 <= j < i -> arr[j] = f j }
774 arr[i] <- if i = len_arr - 1 then max + 1 else 2 * i + 3
780 max_arr = (max - 1) / 2 }
782 let set_next (t: t) (i v: int63) : unit
783 requires { 0 <= i <= t.max /\ i < v <= t.max + 1 }
784 requires { mod i 2 = 1 }
785 requires { forall j. i < j < v -> Seq.get t.marked j }
786 requires { not Seq.get t.marked i }
787 requires { mod v 2 = 1 \/ v = t.max + 1 }
788 writes { t.nexts, t.arr }
789 ensures { t.nexts = Seq.set (old t.nexts) i v }
790 = ghost ( conservation_all_eliminated_marked_on_nexts_change
791 t.marked t.nexts (to_int i) (to_int v) );
793 ghost (t.nexts <- Seq.set t.nexts (to_int i) (to_int v))
795 let get_next (t: t) (i: int63) : int63
796 requires { 3 <= i <= t.max }
797 requires { mod i 2 = 1 }
798 ensures { 3 <= result <= t.max + 1 }
799 ensures { result = Seq.get t.nexts i }
800 ensures { mod result 2 = 1 \/ result = t.max + 1 }
802 if t.arr[x] < 0 then - t.arr[x] else t.arr[x]
804 let set_mark (t: t) (i: int63) : unit
805 requires { 0 <= i <= t.max }
806 requires { mod i 2 = 1 }
807 writes { t.marked, t.arr }
808 ensures { t.marked = Seq.set (old t.marked) i true }
810 ghost ( conservation_all_eliminated_marked_on_marked_change
811 t.marked t.nexts (to_int i));
812 if t.arr[x] >= 0 then begin
813 ghost ( conservation_inv_arr_on_mark t.arr.elts (to_int x) );
814 t.arr[x] <- - t.arr[x]
816 ghost (t.marked <- Seq.set t.marked (to_int i) true)
818 let get_mark (t: t) (i: int63) : bool
819 requires { 0 <= i <= t.max }
820 requires { mod i 2 = 1 }
821 ensures { result = Seq.get t.marked i }
824 let get_max (t: t) : int63
825 ensures { result = t.max /\ result >= 2 }
828 clone EulerSieve with type t = t,
830 val set_next = set_next, val get_next = get_next,
831 val set_mark = set_mark, val get_mark = get_mark,
832 val get_max = get_max
834 predicate inv_count (arr: seq int) (min: int) =
835 forall i. min <= i < arr.length ->
836 (i < div (abs arr[i]) 2 <= arr.length /\
837 - max_int <= arr[i] <= max_int /\
838 (forall j. i < j < div (abs arr[i]) 2 -> arr[j] < 0) /\
839 (forall j. 2 * i + 1 < j < abs arr[i] -> not prime j))
841 (*******************************************************************************)
843 (* PREUVE DU CRIBLE D'EULER *)
845 (*******************************************************************************)
847 let euler_sieve (max: int63) : array63
848 requires { max_int > max >= 3 }
849 ensures { forall i j. 0 <= i < j < result.length -> result[i] < result[j] }
850 ensures { forall i. 0 <= i < result.length -> 2 <= result[i] <= max }
851 ensures { forall i. 0 <= i < result.length -> prime result[i] }
852 ensures { forall i. 2 <= i <= max -> prime i ->
853 exists j. 0 <= j < result.length /\ result[j] = i }
854 = [@vc:do_not_keep_trace] (* traceability info breaks the proof with Vampire on sub goal 13.2 *)
855 let t = create max in
856 let rec loop (n: int63) =
857 requires { 3 <= n <= max }
858 requires { n * n <= max }
859 requires { previously_marked_multiples t.marked n }
860 requires { only_multiples_marked t.marked n }
861 requires { not_marked_impl_next_not_marked t.marked t.nexts n }
862 requires { inv_remove_products t.nexts t.marked n }
863 ensures { forall i. 0 <= i < Seq.length t.marked ->
864 not Seq.get t.marked i <-> prime i }
865 variant { max + 1 - n }
867 let nn = get_next t n in
868 if nn <= max / nn then begin
869 assert { nn * nn <= max };
870 ghost (previously_marked_multiples_impl_prime t.marked (to_int nn));
871 assert { (forall i. n < i < nn -> not prime i)
876 2 <= k < Seq.length t.marked /\
878 by Seq.get t.marked i) };
881 ghost (not_prime_impl_divisor_under_sqrt (to_int nn));
883 2 <= i < Seq.length t.marked ->
884 not Seq.get t.marked i ->
885 not (exists k l. 2 <= k < nn /\ 2 <= l < i /\
887 ghost (no_prod_impl_no_divider (to_int nn));
888 assert { Seq.length t.marked <= nn * nn
890 by nn * (div max nn + 1) > max >= nn * div max nn
891 /\ nn * nn >= nn * (div max nn + 1)
892 by nn >= div max nn + 1 };
893 assert { forall i. 2 <= i < Seq.length t.marked ->
894 not Seq.get t.marked i ->
897 2 <= i < Seq.length t.marked ->
898 not Seq.get t.marked i ->
899 (not (exists k. 2 <= k < nn /\ k <> i /\
904 (divides k i <-> exists l. 2 <= l < i /\ k * l = i)
905 by divides k i -> 2 <= div i k < i) }
907 if max >= 9 then loop 3;
908 assert { forall i. 1 <= i <= t.max_arr -> t.arr[i] >= 0 <-> prime (2 * i + 1) };
909 assert { forall p i. 1 <= p <= t.max_arr ->
910 2 * p + 1 < i < abs t.arr[p] -> not prime i
911 by mod i 2 = 0 -> (Seq.get t.marked i
912 by Seq.get t.nexts (2 * i + 1) = t.arr[i]) };
913 assert { forall j. 1 <= j <= t.max_arr -> t.arr[0 <- 2][j] = t.arr[j] };
914 let ref cnt = 1:int63 in
917 while 2 * p + 1 <= max do
918 invariant { 1 <= p <= t.max_arr + 1 }
919 invariant { 1 <= cnt <= p }
920 invariant { 2 * p + 1 <= max -> t.arr[p] >= 0 }
921 invariant { 2 * p + 1 <= max -> prime (2 * p + 1) }
922 invariant { inv_count t.arr cnt }
923 invariant { ordered t.arr cnt }
924 invariant { all_inf_or_eq t.arr cnt (2 * p) }
925 invariant { forall i. cnt <= i <= t.max_arr ->
926 t.arr[i] >= 0 <-> prime (2 * i + 1) }
927 invariant { forall i. 0 <= i < cnt -> prime t.arr[i] }
928 invariant { forall i. 2 <= i < 2 * p + 1 -> prime i ->
929 exists j. 0 <= j < cnt /\ t.arr[j] = i }
930 variant { t.max_arr + 1 - p , max + 1 - t.arr[p] }
931 let next = t.arr[p] / 2 in
932 if next <= t.max_arr then begin
933 assert { 1 <= p <= t.max_arr /\ t.arr[p] >= 0 /\ prime (2 * p + 1) };
934 if t.arr[next] < 0 then begin
935 label BeforeAssign in
936 t.arr[p] <- - t.arr[next];
937 unchanged_other_elements t.arr.elts (pure { t.arr.elts at BeforeAssign })
938 (to_int p) (- to_int t.arr[next]);
939 assert { forall i. p < i < div t.arr[p] 2 -> t.arr[i] < 0 };
940 assert { t.arr[p] = abs (t.arr at BeforeAssign)[next]
941 > (t.arr at BeforeAssign)[p] > p };
942 conservation_inv_arr_on_jump (pure { t.arr.elts at BeforeAssign })
943 (to_int cnt) (to_int p);
944 assert { cnt <= next < length t.arr };
945 assert { (forall j. 2 * p + 1 < j < (t.arr at BeforeAssign)[p] ->
947 (forall j. 2 * next + 1 < j < abs (t.arr at BeforeAssign)[next] ->
950 label BeforeAssign in
951 t.arr[cnt] <- 2 * p + 1;
952 unchanged_other_elements t.arr.elts (pure { t.arr.elts at BeforeAssign })
953 (to_int cnt) (2 * to_int p + 1);
956 assert { forall k. cnt <= k < length (t.arr at BeforeAssign) ->
957 t.arr[k] = (t.arr at BeforeAssign)[k] }
960 label BeforeAssign in
961 t.arr[cnt] <- 2 * p + 1;
962 unchanged_other_elements t.arr.elts (pure { t.arr.elts at BeforeAssign })
963 (to_int cnt) (2 * to_int p + 1);
966 assert { forall k. cnt <= k < length (t.arr at BeforeAssign) ->
967 t.arr[k] = (t.arr at BeforeAssign)[k] }