{"id":662,"date":"2021-12-27T13:00:31","date_gmt":"2021-12-27T13:00:31","guid":{"rendered":"https:\/\/gigers.com\/blog\/?p=662"},"modified":"2024-06-24T17:33:33","modified_gmt":"2024-06-24T17:33:33","slug":"primzahlen-berechnen","status":"publish","type":"post","link":"https:\/\/gigers.com\/blog\/primzahlen-berechnen\/","title":{"rendered":"Primzahlen berechnen"},"content":{"rendered":"<p>Primzahlen bilden eine Grundlage der Mathematik und sind deshalb auch auf der Sekundarstufe I ein Thema. Allerdings beschr\u00e4nkt sich die Auseinandersetzung auf dieser Stufe h\u00e4ufig darauf, die Primzahlen mithilfe des Siebes von Eratosthenes zu gewinnen und diese anschliessend f\u00fcr die Primfaktorzerlegung von nat\u00fcrlichen Zahlen zu verwenden. Dabei bietet sich das Thema auf gut daf\u00fcr an, die Berechnung von Primzahlen mit dem Computer und zu thematisieren und dabei \u00fcber die Optimierung von Algorithmen zu diskutieren.<\/p>\n<h2>Naiver Ansatz<\/h2>\n<p>In einem ersten Versuch verwenden wir einen ganz einfachen Algorithmus. Wir nehmen zuerst einmal an, jede Zahl sei eine Primzahl. Dann teilen wir diese Zahl durch alle Zahlen, die kleiner als die gew\u00fcnschte Zahl selbst sind. Sollten bei diesen Divisionen der Rest irgendwann 0 sein, verwerfen wir die Annahme, dass es sich um eine Primzahl handelt.<\/p>\n<figure id=\"attachment_664\" aria-describedby=\"caption-attachment-664\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-664\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlenbestimmung_Programm_naiv-1024x631.png\" alt=\"naive Bestimmung einer Primzahl\" width=\"525\" height=\"324\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlenbestimmung_Programm_naiv-1024x631.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlenbestimmung_Programm_naiv-300x185.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlenbestimmung_Programm_naiv-768x474.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlenbestimmung_Programm_naiv.png 1184w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-664\" class=\"wp-caption-text\">Ob es sich bei einer Zahl um eine Primzahl handelt, kann einfach gepr\u00fcft werden.<\/figcaption><\/figure>\n<p>Dieser einfache Algorithmus funktioniert f\u00fcr Zahlen &gt; 1 gut, ist aber sehr langsam, da viele unn\u00f6tigen Berechnungen durchgef\u00fchrt werden. Dies sieht man, wenn man alle Zahlen auff\u00fchrt, welche bei den Divisionen verwendet werden.<\/p>\n<figure id=\"attachment_666\" aria-describedby=\"caption-attachment-666\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-666\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50-1024x768.png\" alt=\"\" width=\"525\" height=\"394\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50-1024x768.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50-300x225.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50-768x576.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50-1536x1152.png 1536w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_naiv_bis_50.png 2048w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-666\" class=\"wp-caption-text\">In der einfachen Version des Algorithmus zur Primzahlenbestimmung steigt der Rechenaufwand linear an.<\/figcaption><\/figure>\n<p>Es f\u00e4llt sofort auf, dass viele unn\u00f6tige Rechenschritte durchgef\u00fchrt werden, weil beispielsweise alle geraden Zahlen (ausser der 2) sicherlich keine Primzahlen sind. Trotzdem wird beispielsweise bei der 50 noch lange weitergerechnet, selbst wenn schon fr\u00fch klar ist, dass es sich nicht um eine Primzahl handeln kann.<\/p>\n<h2>M\u00f6glichst fr\u00fchzeitiger Abbruch<\/h2>\n<p>Die Vermeidung unn\u00f6tiger Rechenschritte bedingt die Neuformulierung des Algorithmus. Daf\u00fcr muss die for-Schleife in Snap! durch eine while-Schleife ersetzt werden. Allerdings steht diese nicht standardm\u00e4ssig zu Verf\u00fcgung, weshalb diese zuerst programmiert werden muss. In Snap! funktioniert dies wie folgt:<\/p>\n<figure id=\"attachment_667\" aria-describedby=\"caption-attachment-667\" style=\"width: 694px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-667\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/while-Schleife.png\" alt=\"\" width=\"694\" height=\"428\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/while-Schleife.png 694w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/while-Schleife-300x185.png 300w\" sizes=\"auto, (max-width: 694px) 100vw, 694px\" \/><figcaption id=\"caption-attachment-667\" class=\"wp-caption-text\">Der neue while-Block wird rekursiv programmiert.<\/figcaption><\/figure>\n<p>Mit der durch die while-Schleife m\u00f6gliche Anpassung des Algorithmus werden unn\u00f6tige Rechenschritte verhindert.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-669\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahl_optimiert-1024x836.png\" alt=\"\" width=\"525\" height=\"429\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahl_optimiert-1024x836.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahl_optimiert-300x245.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahl_optimiert-768x627.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahl_optimiert.png 1174w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/p>\n<p>Dies wird deutlich, wenn man sich noch einmal alle Zahlen anschaut, die nun in den notwendigen Divisionen verwendet werden.<\/p>\n<figure id=\"attachment_671\" aria-describedby=\"caption-attachment-671\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-671\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50-1024x714.png\" alt=\"\" width=\"525\" height=\"366\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50-1024x714.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50-300x209.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50-768x535.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50-1536x1070.png 1536w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_optimiert_bis_50.png 2048w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-671\" class=\"wp-caption-text\">Im Gegensatz zum ersten Versuch werden nur noch bei Primzahlen selbst viele Berechnungen durchgef\u00fchrt.<\/figcaption><\/figure>\n<p>Bei allen Zahlen, welche keine Primzahlen sind, wird die Berechnung schon sehr fr\u00fch abgebrochen. Dies ist auch deshalb von Interesse, weil Primzahlen seltener werden, wenn man gr\u00f6ssere Zahlen untersucht. Das wird bereits in der oben abgebildeten Grafik deutlich:<\/p>\n<ul>\n<li>Zahlenraum 1-25: 2, 3, 5, 7, 11, 13, 17, 19, 23, insgesamt 9 Primzahlen.<\/li>\n<li>Zahlenraum 26-50: 29, 31, 37, 41, 43, 47 , insgesamt 6 Primzahlen.<\/li>\n<\/ul>\n<p>Um das Programm weiter zu optimieren, ist eine mathematische Betrachtung von Teilern notwendig.<\/p>\n<h2>Eigenschaften von Teilern<\/h2>\n<p>Die Teiler einer bestimmten Zahl treten immer paarweise auf, wobei es vorkommen kann, dass die beiden Teiler gleich gross sind:<\/p>\n<ul>\n<li>Teiler von 12: 1 und 12, 2 und 6, 3 und 4.<\/li>\n<li>Teiler von 25: 1 und 25, 5 und 5.<\/li>\n<\/ul>\n<p>Zu jedem grossen Teiler geh\u00f6rt also ein entsprechend kleiner Teiler. Bei der Quadratzahl 25 ist gut ersichtlich, dass zum Teiler 5 kein Teiler vorhanden ist, der gr\u00f6sser als 5 ist, sonst m\u00fcsste es sich, z.B. bei 5 x 6 um eine gr\u00f6ssere Zahl handeln.<\/p>\n<p>Damit ist es m\u00f6glich, die zu \u00fcberpr\u00fcfenden Teiler weiter einzuschr\u00e4nken. Statt bei Primzahlen bis zu n-1 zu pr\u00fcfen, reicht eine Pr\u00fcfung bis zur Quadratwurzel von n aus.<\/p>\n<p>Die \u00c4nderung im Algorithmus beschr\u00e4nkt sich dabei auf das Abbruchkriterium in der while-Schleife.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-672\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/optimierte_while-Schleife-1024x201.png\" alt=\"\" width=\"525\" height=\"103\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/optimierte_while-Schleife-1024x201.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/optimierte_while-Schleife-300x59.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/optimierte_while-Schleife-768x151.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/optimierte_while-Schleife.png 1048w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/p>\n<p>Dadurch verringert sich der Rechenaufwand bei den bisher aufw\u00e4ndigen Primzahlen noch einmal dramatisch, was die Auflistung der ben\u00f6tigten Teiler zeigt:<\/p>\n<figure id=\"attachment_673\" aria-describedby=\"caption-attachment-673\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-673\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-1024x138.png\" alt=\"\" width=\"525\" height=\"71\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-1024x138.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-300x40.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-768x104.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-1536x207.png 1536w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50-2000x276.png 2000w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_weiter_optimiert_bis_50.png 2048w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-673\" class=\"wp-caption-text\">Gegen\u00fcber der urspr\u00fcnglichen Variante hat sich die Anzahl der Rechenschritte drastisch reduziert.<\/figcaption><\/figure>\n<p>Eine weitere Optimierung ist m\u00f6glich, indem man nicht mehr alle Zahlen als Teiler verwendet, sondern nur noch die Primzahlen selbst. Dabei stellt sich aber die Frage, woher dann diese Primzahlen im Voraus bekannt sein sollen.<\/p>\n<h2>Nimm 2<\/h2>\n<p>Mit einem entsprechenden h\u00f6heren Aufwand beim Schreiben des Algorithmus ist es tats\u00e4chlich m\u00f6glich, die Primzahlen aus sich selbst heraus zu erzeugen. Als Voraussetzung wird dazu nur eine Liste mit dem Element 2 ben\u00f6tigt. Alle weitere Primzahlen kann das folgende Programm daraus generieren.<\/p>\n<figure id=\"attachment_674\" aria-describedby=\"caption-attachment-674\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-674\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste-918x1024.png\" alt=\"\" width=\"525\" height=\"586\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste-918x1024.png 918w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste-269x300.png 269w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste-768x857.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste-1376x1536.png 1376w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Primzahlen_mit_Liste.png 1570w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-674\" class=\"wp-caption-text\">W\u00e4hrend die Zeit f\u00fcr die Berechnung insbesondere f\u00fcr gr\u00f6ssere Primzahlen weiterhin sinkt, ist der daf\u00fcr notwendige Algorithmus wesentlich komplexer geworden.<\/figcaption><\/figure>\n<p>Nach dem ersten Durchlauf des Programms besteht die Liste aus den Zahlen 2 und 3, denn es wird bis maximal zur Zahl 3 gepr\u00fcft und diese ist nicht durch 2 teilbar.\u00a0Nach dem zweiten Durchlauf sind die Primzahlen 5 und 7 dazugekommen, denn das Programm pr\u00fcft nun bis 8.\u00a0Der n\u00e4chste Durchlauf pr\u00fcft bis 48 und liefert als letzte Primzahl 47 zur\u00fcck. Bei jedem weiteren Durchlauf wird der untersuchte Zahlenraum gr\u00f6sser und damit die Liste der Primzahlen l\u00e4nger. So k\u00f6nnen aus der 2 alle weiteren Primzahlen generiert werden.<\/p>\n<p>Nebst der schnelleren Berechnung hat dieser Ansatz auch den Vorteil, dass die Berechnung der Primzahlen jederzeit angehalten und sp\u00e4ter wieder fortgesetzt werden kann. Denn alles, was das Programm daf\u00fcr ben\u00f6tigt, ist die Liste mit den Primzahlen, aus welcher es die gr\u00f6sste Primzahl ausliest, um weitere Berechnungen anzustellen.<\/p>\n<p>Im gezeigten Beispiel darf der Computer dazu nicht ausgeschaltet werden, da sich die Liste im fl\u00fcchtigen Speicher befindet. Die gef\u00fchrte Liste k\u00f6nnte aber auch auf eine Harddisk geschrieben werden, wodurch das Programm seine Arbeit auch nach einem tats\u00e4chlichen Unterbruch wieder aufnehmen k\u00f6nnte.<\/p>\n<h2>Laufzeiten<\/h2>\n<p>Die Laufzeiten der unterschiedlichen Varianten unterscheiden sich dramatisch. Gemessen wurde jeweils die Zeit, welche zur Berechnung der ersten n Primzahlen notwendig war.<\/p>\n<figure id=\"attachment_676\" aria-describedby=\"caption-attachment-676\" style=\"width: 525px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-676\" src=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung-1024x615.png\" alt=\"\" width=\"525\" height=\"315\" srcset=\"https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung-1024x615.png 1024w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung-300x180.png 300w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung-768x461.png 768w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung-1536x923.png 1536w, https:\/\/gigers.com\/blog\/wp-content\/uploads\/2021\/12\/Laufzeiten_Primzahlberechnung.png 1653w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption id=\"caption-attachment-676\" class=\"wp-caption-text\">Die Laufzeiten zur Berechnung von Primzahlen steigen in Abh\u00e4ngigkeit vom verwendeten Algorithmus unterschiedlich stark an.<\/figcaption><\/figure>\n<p>W\u00e4hrend bei der einfachsten Version die Laufzeiten immer st\u00e4rker zunehmen, verhalten sich diese in der optimierten Fassung zumindest im untersuchten Zahlenbereich fast linear. Diese Unterschiede sind bei kleinen Zahlenbereich noch klein, werden aber schnell immer gr\u00f6sser.<\/p>\n<h2>Anwendung im Unterricht<\/h2>\n<p>Die vorgestellten Ans\u00e4tze k\u00f6nnen nicht nur daf\u00fcr verwendet werden, bei gr\u00f6sseren Zahlen herauszufinden, ob es sich dabei um Primzahlen handelt. Sie bieten auch eine gute Gelegenheit daf\u00fcr, mit den Sch\u00fclerinnen und Sch\u00fclern die Notwendigkeit der Optimierung von Programmen zu besprechen.<\/p>\n<p>Diese spielt bei vielen Computeranwendungen eine wichtige Rolle, nicht nur weil dadurch Energie und die damit verbundenen Kosten eingespart werden k\u00f6nnen, sondern dadurch werden auch Anwendungen m\u00f6glich, die vorher aus Zeitgr\u00fcnden nicht praktikabel umgesetzt werden konnten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Primzahlen bilden eine Grundlage der Mathematik und sind deshalb auch auf der Sekundarstufe I ein Thema. Allerdings beschr\u00e4nkt sich die Auseinandersetzung auf dieser Stufe h\u00e4ufig darauf, die Primzahlen mithilfe des Siebes von Eratosthenes zu gewinnen und diese anschliessend f\u00fcr die Primfaktorzerlegung von nat\u00fcrlichen Zahlen zu verwenden. Dabei bietet sich das Thema auf gut daf\u00fcr an, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gigers.com\/blog\/primzahlen-berechnen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201ePrimzahlen berechnen\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-662","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/posts\/662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/comments?post=662"}],"version-history":[{"count":7,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/posts\/662\/revisions"}],"predecessor-version":[{"id":694,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/posts\/662\/revisions\/694"}],"wp:attachment":[{"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/media?parent=662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/categories?post=662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gigers.com\/blog\/wp-json\/wp\/v2\/tags?post=662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}