100 likes | 243 Views
ACM ICPC Praktikum. Kapitel 7: Zahlentheorie. Übersicht. Primzahlen Größter gemeinsamer Teiler Kleinstes gemeinsames Vielfaches Modulo Arithmetik. Primzahlen. Test, ob x eine Primzahl ist: Teste alle Zahlen von 1 bis x
E N D
ACM ICPC Praktikum Kapitel 7: Zahlentheorie
Übersicht • Primzahlen • Größter gemeinsamer Teiler • Kleinstes gemeinsames Vielfaches • Modulo Arithmetik
Primzahlen Test, ob x eine Primzahl ist: • Teste alle Zahlen von 1 bis x • x ausreichend, da für jeden Teiler y von x gilt, dass y ¢ z = x für ein z, und entweder y oder z höchstens x sein kann
Primfaktorisierung • prime_factorization(long x) • { • long i; /* counter */ • long c; /* remaining product to factor */ • c = x; • while ((c % 2) == 0) { • printf("%ld\n",2); • c = c / 2; • } • i = 3; • while (i <= (sqrt(c)+1)) { • if ((c % i) == 0) { • printf("%ld\n",i); • c = c / i; • } • else • i = i + 2; • } • if (c > 1) printf("%ld\n",c); • }
Größter gemeinsamer Teiler • Problem: gegeben Zahlen a und b, finde größte Zahl c, so dass c|a und c|b. • c: ggT(a,b) • ggT(a,a) = ggT(a,0) = ggT(0,a) = a • a<b: ggT(a,b) = ggT(a, b mod a)(b=k ¢ a + r, dann ggT(a,b) | r) • a>b: ggT(a,b) = ggT(a mod b, b)
Größter gemeinsamer Teiler • long gcd(long p, long q) /* compute gcd(p,q) */ • { • if (q == 0) return(p); • if (p == 0) return(q); • if (q > p) return(gcd(q % p,p)); • if (p > q) return(gcd(q, p % q)); • return(q); /* p=q */ • }
Größter gemeinsamer Teiler • /* Find the gcd(p,q) and x,y such that p*x + q*y = gcd(p,q) */ • long gcd(long p, long q, long *x, long *y) • { • long x1,y1; /* previous coefficients */ • long g; /* value of gcd(p,q) */ • if (q > p) return(gcd(q,p, &y, &x)); • if (q == 0) { • *x = 1; • *y = 0; • return(p); • } • g = gcd(q, p%q, &x1, &y1); • *x = y1; • *y = (x1 - floor(p/q)*y1); • return(g); • }
Kleinstes gemeinsames Vielfaches • Kleinstes gemeinsames Vielfaches von a und b: kgV(a,b) (englisch: lcm(a,b)) • Regel: a ¢ b = ggT(a,b) ¢ kgV(a,b)
Modulo Arithmetik • Negative Zahlen:-x mod n = n-(x mod n) • Addition:(x+y) mod n = ((x mod n) + (y mod n)) mod n • Multiplikation:x ¢ y mod n = ((x mod n) ¢ (y mod n)) mod nxy mod n = (x mod n)y mod n= [((x mod n)y1) mod n) ¢ ((x mod n)y2) mod n)] mod n mit y = y1 + y2
Anwendungen • Finde letzte Ziffer einer großen Zahl(z.B. 2100) • RSA Verschlüsselung • Kalenderberechnungen