|
|
@ -172,7 +172,9 @@ |
|
|
|
"metadata": {}, |
|
|
|
"source": [ |
|
|
|
"# Euler function φ and Z*n\n", |
|
|
|
"From slides 2020-4135-l07 - Number Theory for Public Key Cryptography" |
|
|
|
"From slides 2020-4135-l07 - Number Theory for Public Key Cryptography\n", |
|
|
|
"\n", |
|
|
|
"> $\\phi(16) = \\phi(2^{4}) = 16*\\left(1-\\frac{1}{2}\\right)$" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
@ -184,8 +186,8 @@ |
|
|
|
"name": "stdout", |
|
|
|
"output_type": "stream", |
|
|
|
"text": [ |
|
|
|
"φ(81) = 54 since the 54 items in Z*81 are each relatively prime to 81.\n", |
|
|
|
"Z*81 = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80]\n" |
|
|
|
"φ(16) = 8 since the 8 items in Z*16 are each relatively prime to 16.\n", |
|
|
|
"Z*16 = [1, 3, 5, 7, 9, 11, 13, 15]\n" |
|
|
|
] |
|
|
|
} |
|
|
|
], |
|
|
@ -204,7 +206,7 @@ |
|
|
|
" r.append(i)\n", |
|
|
|
" return r\n", |
|
|
|
"\n", |
|
|
|
"n = 81\n", |
|
|
|
"n = 16\n", |
|
|
|
"ar = z_star(n)\n", |
|
|
|
"e = len(ar)\n", |
|
|
|
"print(f\"φ({n}) = {e} since the {e} items in Z*{n} are each relatively prime to {n}.\")\n", |
|
|
@ -215,13 +217,78 @@ |
|
|
|
"cell_type": "markdown", |
|
|
|
"metadata": {}, |
|
|
|
"source": [ |
|
|
|
"## Euler’s Totient\n", |
|
|
|
"- https://www.dcode.fr/euler-totient\n", |
|
|
|
"- https://www.ibnus.io/eulers-totient-function-using-python/\n", |
|
|
|
"\n", |
|
|
|
"In general:\n", |
|
|
|
"\n", |
|
|
|
"> $\\varphi(n) = n \\prod_{p \\mid n} \\left( 1 - \\frac{1}{p} \\right)$\n", |
|
|
|
"\n", |
|
|
|
"Examples:\n", |
|
|
|
"> $\\varphi(16) = \\varphi(2^{4}) = 16*\\left(1-\\frac{1}{2}\\right) = 8$\n", |
|
|
|
"\n", |
|
|
|
"> $\\varphi(1125) = \\varphi(33555) = 1125\\left(1-\\frac{1}{3}\\right)\\left(1-\\frac{1}{5}\\right) = 600$\n" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 6, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
|
"name": "stdout", |
|
|
|
"output_type": "stream", |
|
|
|
"text": [ |
|
|
|
"𝜑(1125) = 600\n" |
|
|
|
] |
|
|
|
} |
|
|
|
], |
|
|
|
"source": [ |
|
|
|
"# Euler's Totient Function\n", |
|
|
|
"# using Euler's product formula\n", |
|
|
|
"def totient(n) :\n", |
|
|
|
" result = n # Initialize result as n\n", |
|
|
|
"\n", |
|
|
|
" # Consider all prime factors\n", |
|
|
|
" # of n and for every prime\n", |
|
|
|
" # factor p, multiply result with (1 – 1/p)\n", |
|
|
|
" p = 2\n", |
|
|
|
" while(p * p <= n) :\n", |
|
|
|
"\n", |
|
|
|
" # Check if p is a prime factor.\n", |
|
|
|
" if (n % p == 0) :\n", |
|
|
|
"\n", |
|
|
|
" # If yes, then update n and result\n", |
|
|
|
" while (n % p == 0) :\n", |
|
|
|
" n = n // p\n", |
|
|
|
" result = result * (1.0 - (1.0 / (float) (p)))\n", |
|
|
|
" p = p + 1\n", |
|
|
|
"\n", |
|
|
|
" # If n has a prime factor\n", |
|
|
|
" # greater than sqrt(n)\n", |
|
|
|
" # (There can be at-most one\n", |
|
|
|
" # such prime factor)\n", |
|
|
|
" if (n > 1) :\n", |
|
|
|
" result = result * (1.0 - (1.0 / (float)(n)))\n", |
|
|
|
"\n", |
|
|
|
" return (int)(result)\n", |
|
|
|
"\n", |
|
|
|
"n = 1125\n", |
|
|
|
"print(f\"𝜑({n}) = {totient(1125)}\")" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "markdown", |
|
|
|
"metadata": {}, |
|
|
|
"source": [ |
|
|
|
"# Testing for primality\n", |
|
|
|
"From slides 2020-4135-l07 - Number Theory for Public Key Cryptography" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 6, |
|
|
|
"execution_count": 7, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
@ -245,14 +312,14 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 7, |
|
|
|
"execution_count": 8, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
|
"name": "stdout", |
|
|
|
"output_type": "stream", |
|
|
|
"text": [ |
|
|
|
"1105 is composite\n" |
|
|
|
"1105 is probable prime\n" |
|
|
|
] |
|
|
|
} |
|
|
|
], |
|
|
@ -299,7 +366,7 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 8, |
|
|
|
"execution_count": 9, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
@ -382,7 +449,7 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 9, |
|
|
|
"execution_count": 10, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
@ -442,7 +509,7 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 10, |
|
|
|
"execution_count": 11, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
@ -519,7 +586,7 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 11, |
|
|
|
"execution_count": 12, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
|