Gymnasium Kamenz/Informatik/Verschlüsselung

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Pascal</language>
[[Bild:InfWolfS_Verschlüsselung.gif|InfWolfS_Verschlüsselung.gif]]
== Das Sieb des Eratosthenes ==

Der griechische Mathematiker, Geograph, Philosoph, Philologe und Dichter '''Eratosthenes von Kyrene''' (* zwischen 276 und 273 v. Chr.; † um 194 v. Chr.) war der erste Gelehrte der Antike, der durch eine wissenschaftlich fundierte Messung den Umfang der Erde mit erstaunlicher Genauigkeit bestimmt hat.<br />
Auf ihn geht aber auch ein interessanter Algorithmus zur Bestimmung aller ''Primzahlen'' zurück.<br />

=== Algorithmus ===

* Notiere die natürlichen Zahlen, beginne mit <math>2</math>.

<blockquote>
<math>2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...</math>
</blockquote>

* Unterstreiche die <math>2</math> und streiche alle Vielfachen von <math>2</math>.

<blockquote>
<math>\usepackage{ulem} \uline{2}, 3, \xout{4}, 5, \xout{6}, 7, \xout{8}, 9, \xout{10}, 11, \xout{12}, 13, \xout{14}, 15, \xout{16}, 17, \xout{18}, 19, \xout{20}, ...</math>
</blockquote>

* Unterstreiche die erste freie Zahl (in diesem Falle die Zahl <math>3</math>) und streiche deren Vielfachen.

<blockquote>
<math>\usepackage{ulem} \uline{2}, \uline{3}, \xout{4}, 5, \xout{6}, 7, \xout{8}, \xout{9}, \xout{10}, 11, \xout{12}, 13,
\xout{14}, \xout{15}, \xout{16}, 17, \xout{18}, 19, \xout{20}, ...</math>
</blockquote>

* Verfahre mit allen weiteren freien Zahlen ebenso.

<blockquote>
<math>\usepackage{ulem} \uline{2}, \uline{3}, \xout{4}, \uline{5}, \xout{6}, \uline{7}, \xout{8}, \xout{9}, \xout{10}, \uline{11}, \xout{12}, \uline{13}, \xout{14}, \xout{15}, \xout{16}, \uline{17}, \xout{18}, \uline{19}, \xout{20}, ...</math>
</blockquote>

* Alle unterstrichenen Zahlen sind Primzahlen.

=== Lösungsidee ===

* Belege ein eindimensionales Feld (''Array'') mit <math>n</math> ganzen Zahlen. Beginne mit der <math>2</math>.
* Setze die Vielfachen jedes der von Null verschiedenen Feldelemente auf Null. Beginne ebenfalls bei <math>2</math>.
* Gib nur die Feldelemente aus, die von Null verschieden sind.


=== Implementation ===

<code id="4d35b3f554587">
var grenze: integer;
    liste : array[0..1000000] of integer;
procedure primausgabe(n: integer);
 var i, zaehler: integer;
 begin
  zaehler:=0; 
  for i:=2 to n do
   if liste[i]<>0 then
   begin
    zaehler:=zaehler+1; 
    if (zaehler mod 15)=0 then
     writeln(inttostr(liste[i])+', ')
    else
     write(inttostr(liste[i])+', ');
   end;
 end;

procedure primsieb(n: integer);
 var i, j: integer;
 begin 
  // Implementation des Algorithmus
 end;
</code>

<code id="4d35b3f554606" hidden>
var testliste: array[0..1000000] of integer;

procedure testprimsieb(n: integer);
 var i, j: integer;
 begin 
  for i:=2 to n do testliste[i]:=i;
  for i:=2 to n do
  begin
   j:=2*i;
   while j<=n do
   begin
    testliste[j]:=0;
    j:=j+i;
   end;
  end;
 end;

function korrekt(n: integer): boolean;
 var i   : integer;
     test: boolean;
 begin
  test:=true;
  primsieb(n);testprimsieb(n);
  for i:=2 to n do 
   test:=test and (testliste[i]=liste[i]);
  result:=test;
 end;
</code>

<check>
result:=korrekt(20);
</check>

<run id="4d2cc6e0afa01">
grenze:=1000;
primsieb(grenze);
primausgabe(grenze);
</run>



=== Aufgaben ===

# Diskutieren Sie ausführlich, ob sich der intuitive Algorithmusbegriff auf das "Sieb des Eratosthenes" anwenden lässt.
# Untersuchen Sie die Effizienz Ihrer Implementation.


=== Test ===

<code id="4d36ea285fa00">
procedure test(var s,d,p: integer);
var z1, z2: integer;
begin
 s:= z1+z2;
 d:= z1-z2;
 p:= z1*z2;
end;
</code>

<run id="4d36ea285fa90">
z1:=7;
z2:=5;
</run>