|
Development of Algorithmic Constructions |
21:14:28
| | | 19.Apr 2024
|
|
Sieve of Ulam (vertical II)
mathematical description
Instead of sieving all odd numbers by the order of rising numbers,
the numbers are sorted in columns and each colomn is sieved:
| 1 | | 3 | | 5 | | 7 | | 9 | | 11 | | 13 | | 15 | | 17 | | 19 | | 21 | | 23 | | 25 | | 27 | | 29 |
| 31 | | 33 | | 35 | | 37 | | 39 | | 41 | | 43 | | 45 | | 47 | | 49 | | 51 | | 53 | | 55 | | 57 | | 59 |
| 61 | | 63 | | 65 | | 67 | | 69 | | 71 | | 73 | | 75 | | 77 | | 79 | | 81 | | 83 | | 85 | | 87 | | 89 |
| 91 | | 93 | | 95 | | 97 | | 99 | | 101 | | 103 | | 105 | | 107 | | 109 | | 111 | | 113 | | 115 | | 117 | | 119 |
| 121 | | 123 | | 125 | | 127 | | 129 | | 131 | | 133 | | 135 | | 137 | | 139 | | 141 | | 143 | | 145 | | 147 | | 149 |
| 151 | | 153 | | 155 | | 157 | | 159 | | 161 | | 163 | | 165 | | 167 | | 169 | | 171 | | 173 | | 175 | | 177 | | 179 |
| 181 | | 183 | | 185 | | 187 | | 189 | | 191 | | 193 | | 195 | | 197 | | 199 | | 201 | | 203 | | 205 | | 207 | | 209 |
| 211 | | 213 | | 215 | | 217 | | 219 | | 221 | | 223 | | 225 | | 227 | | 229 | | 231 | | 233 | | 235 | | 237 | | 239 |
| 241 | | 243 | | 245 | | 247 | | 249 | | 251 | | 253 | | 255 | | 257 | | 259 | | 261 | | 263 | | 265 | | 267 | | 269 |
| 271 | | 273 | | 275 | | 277 | | 279 | | 281 | | 283 | | 285 | | 287 | | 289 | | 291 | | 293 | | 295 | | 297 | | 299 |
| 301 | | 303 | | 305 | | 307 | | 309 | | 311 | | 313 | | 315 | | 317 | | 319 | | 321 | | 323 | | 325 | | 327 | | 329 |
| 331 | | 333 | | 335 | | 337 | | 339 | | 341 | | 343 | | 345 | | 347 | | 349 | | 351 | | 353 | | 355 | | 357 | | 359 |
| 361 | | 363 | | 365 | | 367 | | 369 | | 371 | | 373 | | 375 | | 377 | | 379 | | 381 | | 383 | | 385 | | 387 | | 389 |
| 391 | | 393 | | 395 | | 397 | | 399 | | 401 | | 403 | | 405 | | 407 | | 409 | | 411 | | 413 | | 415 | | 417 | | 419 |
| 421 | | 423 | | 425 | | 427 | | 429 | | 431 | | 433 | | 435 | | 437 | | 439 | | 441 | | 443 | | 445 | | 447 | | 449 |
| 451 | | 453 | | 455 | | 457 | | 459 | | 461 | | 463 | | 465 | | 467 | | 469 | | 471 | | 473 | | 475 | | 477 | | 479 |
| 481 | | 483 | | 485 | | 487 | | 489 | | 491 | | 493 | | 495 | | 497 | | 499 | | 501 | | 503 | | 505 | | 507 | | 509 |
| 511 | | 513 | | 515 | | 517 | | 519 | | 521 | | 523 | | 525 | | 527 | | 529 | | 531 | | 533 | | 535 | | 537 | | 539 |
| 541 | | 543 | | 545 | | 547 | | 549 | | 551 | | 553 | | 555 | | 557 | | 559 | | 561 | | 563 | | 565 | | 567 | | 569 |
| 571 | | 573 | | 575 | | 577 | | 579 | | 581 | | 583 | | 585 | | 587 | | 589 | | 591 | | 593 | | 595 | | 597 | | 599 |
| 601 | | 603 | | 605 | | 607 | | 609 | | 611 | | 613 | | 615 | | 617 | | 619 | | 621 | | 623 | | 625 | | 627 | | 629 |
| 631 | | 633 | | 635 | | 637 | | 639 | | 641 | | 643 | | 645 | | 647 | | 649 | | 651 | | 653 | | 655 | | 657 | | 659 |
| 661 | | 663 | | 665 | | 667 | | 669 | | 671 | | 673 | | 675 | | 677 | | 679 | | 681 | | 683 | | 685 | | 687 | | 689 |
| 691 | | 693 | | 695 | | 697 | | 699 | | 701 | | 703 | | 705 | | 707 | | 709 | | 711 | | 713 | | 715 | | 717 | | 719 |
| 721 | | 723 | | 725 | | 727 | | 729 | | 731 | | 733 | | 735 | | 737 | | 739 | | 741 | | 743 | | 745 | | 747 | | 749 |
| 751 | | 753 | | 755 | | 757 | | 759 | | 761 | | 763 | | 765 | | 767 | | 769 | | 771 | | 773 | | 775 | | 777 | | 779 |
| 781 | | 783 | | 785 | | 787 | | 789 | | 791 | | 793 | | 795 | | 797 | | 799 | | 801 | | 803 | | 805 | | 807 | | 809 |
| 811 | | 813 | | 815 | | 817 | | 819 | | 821 | | 823 | | 825 | | 827 | | 829 | | 831 | | 833 | | 835 | | 837 | | 839 |
| 841 | | 843 | | 845 | | 847 | | 849 | | 851 | | 853 | | 855 | | 857 | | 859 | | 861 | | 863 | | 865 | | 867 | | 869 |
| 871 | | 873 | | 875 | | 877 | | 879 | | 881 | | 883 | | 885 | | 887 | | 889 | | 891 | | 893 | | 895 | | 897 | | 899 |
The columns started with 3, 5, 9, 15, 21, 25, 27 can be disregarded because gcd (column, 30)>1
For this example all numbers are smaller than 30*30.
Therefore after sieving the coloumns by the primes < 30 only the primes remains.
Regarding a column where the first number is r.
The first occurance of a prime pi > 5 in this column has to be of the form
pi*t = 1 mod 30
t = pi^(-1) mod 30
The inverse of pi mod 30 can be calculated one time in the beginning of the algorithm.
The first occurance of pi in the row r can be calculated by
y=r*[(pi*pi^(-1)-1) / 30] mod pi
As the value of y.th row is divisible by pi, all values y+pi | pi
All numbers which are divisible by pi are sieved out.
The first column is preset by 0, the numbers are not calculated.
The sieving vertical is made by flipping one bit from 0 to 1
from the starting point up to a.
The primes which remain on the column are representing by the zeros,
All non primes which are representant by 1 are reset to zero for the next column.
The number of zeros are counted.
You get the number of all primes concerning each colonm without the sieved primes.
Results:
Based on a Implementation in Cuda on a graphiccard Geforce 650 with 192 Cuda cores
a) a=2*3*5*7*11*13*17=510.510
numbers below a*a = 260620460100 ~ 2,6 * 10^11
columns which have to be examined 18.1 % = 92.159
Runtime : 17,51 min
b) a=2*3*5*7*11*13*17*19 = 9.699.690
numbers below a*a = 94083986096100 ~ 9,4 * 10^13
columns which have to be examined 17.1 % = 1.658.879
Runtime : ~ 5752 min
For comparison :
a) My best implementation on a single processor needs
228 min for the calculation up to 10^12
(Athlon 64 4000+ 128kbyte 1. Level Cache)
The Cuda implementation is therefore more than three time faster.
Implementation
for Cuda
in Mupad
- m:=30;
p:={7,11,13,17,19,23,29};
for i from 1 to 7 do
p_inv:=p[i]^(-1) mod m;
p_start[i]:=(p[i]*p_inv-1)/m;
end_for;
for j from 1 to m step 2 do
if gcd (j, m)=1 then
// Preset coloum with 0
for i from 0 to m-1 do
liste[i]:=0;
end_for;
// Sieving
for i from 1 to nops (p) do
start:=p_start[i]*j mod p[i];
print (j, p[i], start);
while start<m do
liste[start]:=1;
start:=start+p[i]
end_while;
end_for;
// Result
for i from 0 to m-1 do
if liste [i]=0 then
print (i*m+j, isprime (i*m+j));
end_if;
end_for;
end_if;
end_for;
1, 7, 3
1, 11, 4
1, 13, 3
1, 17, 13
1, 19, 12
1, 23, 13
1, 29, 28
1, FALSE
31, TRUE
61, TRUE
151, TRUE
181, TRUE
211, TRUE
241, TRUE
271, TRUE
331, TRUE
421, TRUE
541, TRUE
571, TRUE
601, TRUE
631, TRUE
661, TRUE
691, TRUE
751, TRUE
811, TRUE
7, 7, 0
7, 11, 6
7, 13, 8
7, 17, 6
7, 19, 8
7, 23, 22
7, 29, 22
37, TRUE
67, TRUE
97, TRUE
127, TRUE
157, TRUE
277, TRUE
307, TRUE
337, TRUE
367, TRUE
397, TRUE
457, TRUE
487, TRUE
547, TRUE
577, TRUE
607, TRUE
727, TRUE
757, TRUE
787, TRUE
877, TRUE
11, 7, 5
11, 11, 0
11, 13, 7
11, 17, 7
11, 19, 18
11, 23, 5
11, 29, 18
41, TRUE
71, TRUE
101, TRUE
131, TRUE
191, TRUE
251, TRUE
281, TRUE
311, TRUE
401, TRUE
431, TRUE
461, TRUE
491, TRUE
521, TRUE
641, TRUE
701, TRUE
761, TRUE
821, TRUE
881, TRUE
13, 7, 4
13, 11, 8
13, 13, 0
13, 17, 16
13, 19, 4
13, 23, 8
13, 29, 16
43, TRUE
73, TRUE
103, TRUE
163, TRUE
193, TRUE
223, TRUE
283, TRUE
313, TRUE
373, TRUE
433, TRUE
463, TRUE
523, TRUE
613, TRUE
643, TRUE
673, TRUE
733, TRUE
823, TRUE
853, TRUE
883, TRUE
17, 7, 2
17, 11, 2
17, 13, 12
17, 17, 0
17, 19, 14
17, 23, 14
17, 29, 12
47, TRUE
107, TRUE
137, TRUE
167, TRUE
197, TRUE
227, TRUE
257, TRUE
317, TRUE
347, TRUE
467, TRUE
557, TRUE
587, TRUE
617, TRUE
647, TRUE
677, TRUE
797, TRUE
827, TRUE
857, TRUE
887, TRUE
19, 7, 1
19, 11, 10
19, 13, 5
19, 17, 9
19, 19, 0
19, 23, 17
19, 29, 10
79, TRUE
109, TRUE
139, TRUE
199, TRUE
229, TRUE
349, TRUE
379, TRUE
409, TRUE
439, TRUE
499, TRUE
619, TRUE
709, TRUE
739, TRUE
769, TRUE
829, TRUE
859, TRUE
23, 7, 6
23, 11, 4
23, 13, 4
23, 17, 10
23, 19, 10
23, 23, 0
23, 29, 6
53, TRUE
83, TRUE
113, TRUE
173, TRUE
233, TRUE
263, TRUE
293, TRUE
353, TRUE
383, TRUE
443, TRUE
503, TRUE
563, TRUE
593, TRUE
653, TRUE
683, TRUE
743, TRUE
773, TRUE
863, TRUE
29, 7, 3
29, 11, 6
29, 13, 9
29, 17, 3
29, 19, 6
29, 23, 9
29, 29, 0
59, TRUE
89, TRUE
149, TRUE
179, TRUE
239, TRUE
269, TRUE
359, TRUE
389, TRUE
419, TRUE
449, TRUE
479, TRUE
509, TRUE
569, TRUE
599, TRUE
659, TRUE
719, TRUE
809, TRUE
839, TRUE