uebrig := zahl - 2 mod teiler; ist nicht das, was du willst.
mod wird vor +*-/ ausgewertet.
Was du willst ist
uebrig := ( zahl - 2 ) mod teiler;
In deinem Code berechnest du in jeder Runde drei Mal, ob eine Zahl (du rechnest für zahl-2, zahl und zahl+2) prim ist. Wie du gesehen hast geht es auch mit einer Berechnung pro Runde: Du könntest dir jeweils prim oder nicht für zahl und zahl+2 merken. In der nächsten "ungeraden zahl Runde" kannst du dann auf diese Werte zurückgreifen und musst nur für "zahl+2" rechnen.
Wie besprochen: Ausser 2 ist keine Primzahl gerade. Überprüfe also nur ungerade teiler.
teiler := teiler + 2;
Wie besprochen: Prüfe nur für ungerade Teiler von 3 bis sqrt(zahl).
Delphi-Quellcode:
ist_prim := true;
teiler := 3;
pruefebis := trunc(sqrt(zahl));
repeat
ist_prim := zahl mod teiler <> 0;
inc( teiler, 2 );
until not ist_prim or ( teiler > pruefebis );
Fibo müsstest du nicht für jede Zahl immer neu berechnen. Es reicht, wenn du dir immer die nächste Fibo-Zahl f > zahl merkst und dann in jeder Runde auf f=zahl prüfst.
Das spielt hier keine grosse Rolle - aber Effizienz in Schleifen ist wichtig
.