Diskussion:Primtalsalgoritm för C

message: {| align=center style="background: #f7f8ff; border: 1px solid #aaa; padding: .2em; margin-bottom: 3px; width: auto;"
|-
| width="50px" | [[Image:Evolution-tasks.png|50px|Sidor som bör raderas]]
|| Den här artikeln har varit nominerad till [[Wikipedia:Sidor som bör raderas|sidor som bör raderas]]. Det beslutades att artikeln skulle '''raderas'''. Se vidare [[Wikipedia:Sidor som bör raderas/{{PAGENAME}}|diskussionen]].
|}
<!----Ruta som visar att artiklen tidigare har hanterats på SSBR ---->
Alla primtal är på formen 6*k +- 1 ( k > 1 ) så det räcker med att testa med sådana tal

message: Jag misstänker att det är den vetskapen, som legat bakom de inledande if-satserna i C++ exemplet. Där kontrolleras nämligen särskilt om n är 2 eeler 3, vilket är de enda primtal, som inte passar in i ovanstående form. Eventuellt kan man testa om n kan skrivas som 6k+-1 och returnera false om så inte är fallet. Följande kodrad kan t.ex. användas.
'''if''' ((((n % 6)-1)&3)!=0) '''return false''';
Å andra sidan är det tveksamt om det verkligen tillför så mycket. Eftersom 2 och 3 ändå är de första två faktorer som testas när funktionen körs, kommer 2/3 av alla sammansatta tal att upptäckas vid någon av dessa två första prov. Jag föreslår istället att metoden ändras, så att den blir lite lättare att förstå. Följande borde fungera precis lika bra som den första.
 //Primtalsfunktionen
 '''bool''' primtal('''int''' n)
 {
     '''if''' (n<2) '''return false''';                   //0, 1 och negativa tal är ej primtal i det här sammanhanget  
     '''if''' ((n&1)

message: ==0) return (n==2);     // Om minst signifikanta biten är 0, är det ett jämnt tal.
     int limit = (int)sqrt(n);
     for (int i=3;i <= limit;i += 2)
     {
         if (n%i == 0) return false;          //Om n är delbart med något är det ej primtal
     }                       
     return true;
 }
Vad som däremot skulle kunna snabba upp rutinen avsevärt är att bara testa faktorer, som själva är primtal. Det finns ingen anledning att fråga om n är delbart med 9 om det inte var delbart med 3. Istället för att prova att dela med alla udda heltal från 3 till sqrt(n), bör rutinen först använda en lista med kända primtal för att se om något av dem delar n. Metoden behöver inte känna till alla primtal upp till sqrt(n) för att det ska fungera. När de kända primtalen inte längre räcker till, kan man låta funktionen arbeta vidare med varje (eller vartannat) heltal upp till sqrt(n).
När man arbetar med mycket stora tal - ett par hundra bitar och större - har jag upptäckt att det går fortare om man provar flera primfaktorer på en gång. Jag använder då euklides algoritm för att hitta gemensamma nämnare mellan n och f, där det första f jag provar med kan vara 2*3*5*7*11*13 eller t.o.m. 2*3*5*7*11*13*17*19*23. Endast ett mycket liten procent sammansatta tal klarar sig igenom det första testet utan upptäckt.
För små n kan det istället löna sig att testa alla värden på i från 5 och upp till sqrt(n). De tre första värden som då kommer att provas är 5, (2*3) och 7, som tillsammans hittar en stor procent av alla låga sammansatta tal.

message: Jag undrar om denna artikel verkligen är att betrakta som encyklopedisk. /dcastor 9 februari 2006 kl.02.11 (CET)
thread_title:  Encyklopediskt material?