17. januar 2004 - 21:21Der er
27 kommentarer og 1 løsning
Oversæt matematisk algoritme til kode, meget svær opgave
Hejsa, jeg har følgende matematiske algoritme som jeg godt kunne tænke mig oversat til C#, men den er lidt for indviklet til mine evner.
Nogen som har lyst til at give det et forsøg ?
Input: integer n > 1 1. if ( n is of the form ab, b > 1 ) output COMPOSITE; 2. r = 2; 3. while(r < n) { 4. if ( gcd(n,r) 6= 1 ) output COMPOSITE; 5. if (r is prime) 6. let q be the largest prime factor of r -1; 7. if (q ≥ 4√r log n) and (n^((r-1)/q) ≠ 1 (mod r)) 8. break; 9. r r + 1; 10. } 11. for a = 1 to 2√r log n 12. if ( (x - a)^n ≠ (x^n - a)(mod x^r - 1,n)) output COMPOSITE; 13. output PRIME;
ps. det er en algoritme til at finde primtal og ved godt der findes meget simplere algoritmer, men denne skulle være den mest effektive.
Her er hvad jeg har fået lavet indtil videre, umiddelbart virker den fint, men jeg mangler stadig at implementer lidt.
using System;
namespace Primtal_i_P { class Class1 { [STAThread] static void Main(string[] args) { prime(Convert.ToInt32(Console.ReadLine())); //Console.WriteLine(gcd(414,662)); Console.ReadLine(); } public static int gcd(int a, int b) { int x = a; int y = b; while (y != 0) { int r = x % y; x = y; y = r; } return x; }
public static bool prime(int n) { //if(n is of the form a^b, b > 1) output COMPOSITE; int r = 2; while( r < n) { if(gcd(n,r) != 1) { Console.WriteLine(n +" er ikke et primtal"); return false; } else { int q = 1; // let q be the largest prime factor of r - 1 if(q >= 4*Math.Sqrt(r * Math.Log(n)) & (n*((r-1)/q) != 1 % r)) break; } r++; } int a = 1; if(a == 2 * Math.Sqrt( r * Math.Log(n))) //if( ((x-a)^n != (x^n - a)) % x^r - 1) { Console.WriteLine(n +" er ikke et primtal"); return false; } Console.WriteLine(n +" er et primtal"); return true; }
hmm, har lige kørt nogle tests med og uden din kode, hvis jeg skal finde alle primtal fra 1 -> 1000 så er det en del hurtigere med din kode, men hvis jeg forsøger mig med 1 -> 10000 så blir det faktisk langsommere
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.