|
|
|
|
|
Het klassieke vermenigvuldigingsalgoritme werkt door elk woord met elk woord te vermenigvuldigen, en toe te voegen aan het juiste woord in het resultaat. Er kan hier mogelijks overflow plaatsvinden, die we dan overbrengen naar het volgende woord.
|
|
Het algoritme van Karatsuba herschrijft de vermenigvuldiging van $a*b = (a_1*x^{n/2}+a_0)(b_1*x^{n/2}+b_0) = a_1*b_1*x^n + a_0*b_0 + (a_1*b_0+a_0*b_1)*x^2{n/2} = a_1*b_1*x^n + a_0*b_0 + ((a_1+a_0)(b_1+b_0) -a_1*b_1 a_0*b_0) *x^2{n/2}$. Hierdoor zijn er slechts drie vermenigvuldigingen nodig, en is de tijdscomplexiteit $O(n^{log_2 3})$.
|
|
(True, 2, 0.00012300000003051537, 0.00019199999996999395) (True, 4, 8.500000012645614e-05, 0.00042500000017753337) (True, 8, 0.00016699999991942605, 0.0013279999998303538) (True, 16, 0.0003979999999046413, 0.004126999999925829) (True, 32, 0.0011730000001080043, 0.012536000000181957) (True, 64, 0.0038919999999507127, 0.03792399999997542) (True, 128, 0.013846000000057757, 0.11475199999995311) (True, 256, 0.05231499999990774, 0.3351199999999608) (True, 512, 0.19084700000007615, 0.5938400000000001) (True, 1024, 0.42531700000017736, 1.5718580000000202) (True, 2048, 1.696279000000004, 4.728260000000091) (True, 4096, 6.679397999999992, 14.18733599999996) (True, 8192, 26.168273, 42.64646799999991) (True, 16384, 103.19446300000004, 128.25840799999992) (True, 32768, 409.68479, 384.0914730000004) (True, 2, 0.00012300000003051537, 0.00019199999996999395) (True, 4, 8.500000012645614e-05, 0.00042500000017753337) (True, 8, 0.00016699999991942605, 0.0013279999998303538) (True, 16, 0.0003979999999046413, 0.004126999999925829) (True, 32, 0.0011730000001080043, 0.012536000000181957) (True, 64, 0.0038919999999507127, 0.03792399999997542) (True, 128, 0.013846000000057757, 0.11475199999995311) (True, 256, 0.05231499999990774, 0.3351199999999608) (True, 512, 0.19084700000007615, 0.5938400000000001) (True, 1024, 0.42531700000017736, 1.5718580000000202) (True, 2048, 1.696279000000004, 4.728260000000091) (True, 4096, 6.679397999999992, 14.18733599999996) (True, 8192, 26.168273, 42.64646799999991) (True, 16384, 103.19446300000004, 128.25840799999992) (True, 32768, 409.68479, 384.0914730000004) |
We zien duidelijk dat het klassieke vermenigvuldiginsalgoritme sneller is voor kleine inputs, maar dat het kwadratisch stijgt en voor grotere inputs trager wordt.
Onderstaande functie kijkt na of de orde van een element gelijk is aan een parameter orde. Factors wordt meegegeven zodat het niet voor elke oproep opnieuw berekent moet worden.
Het kijkt na of $element^{order}$ gelijk is aan $1$, zodat de orde van het element zeker een deler van order is.
Daarna kijkt het of de orde niet kleiner is dan order, door $order/factor$ als macht te proberen voor elke factor van order.
|
De Lucas Test of N-1 test, test of n een priemgetal is door te kijken of er een getal $g$ bestaat zodat de orde van $g$ over $\mathbb{Z}/n\mathbb{Z}$ gelijk is aan $n-1$.
|
|
De N+1 test, test of n een priemgetal is door te proberen een $t$ te vinden zodat $x$ orde $n+1$ heeft over $R_t = (\mathbb{Z}/n\mathbb{Z})[x]/(x^2-tx+1)$.
|
True True |
|
Tested first 10 numbers succesfully. Tested first 20 numbers succesfully. Tested first 30 numbers succesfully. Tested first 40 numbers succesfully. Tested first 50 numbers succesfully. Tested first 60 numbers succesfully. Tested first 70 numbers succesfully. Tested first 80 numbers succesfully. Tested first 90 numbers succesfully. Tested first 100 numbers succesfully. Tested first 10 numbers succesfully. Tested first 20 numbers succesfully. Tested first 30 numbers succesfully. Tested first 40 numbers succesfully. Tested first 50 numbers succesfully. Tested first 60 numbers succesfully. Tested first 70 numbers succesfully. Tested first 80 numbers succesfully. Tested first 90 numbers succesfully. Tested first 100 numbers succesfully. |
|
|
|
|
|
|
|
|