lambda n:[k/n for k in range(n*n)if k/n*k%n==1]
Experimente online!
fundo
Considere o anel . Embora esse anel seja geralmente definido usando as classes de resíduos módulo n , também pode ser considerado o conjunto Z n = { 0 , … , n - 1 } , onde os operadores de adição e multiplicação são definidos por a + n b = ( a + b )( Zn, +n, ⋅n)nZn= { 0 , … , n - 1 } e a ⋅ n b = a ⋅ ba +nb = ( a + b )%n , onde + ,a⋅nb=a⋅b%n denotam os operadores usuais de adição, multiplicação e módulo sobre os números inteiros.+,⋅, and %
Dois elementos e b de Z n são chamados inversos multiplicativos mútuos módulo n se a ⋅ n b = 1abZnn . Note que 1a⋅nb=1%n sempre que n > 1 .1%n=1n>1
Corrija e deixe a ser um coprime de n em Z n . Se um ⋅ n x = um ⋅ n y por dois elementos de x e y de Z n , temos que um ⋅ xn>1anZna⋅nx=a⋅nyxyZn . Isso implica que a ⋅ ( x - y )a⋅x%n=a⋅y%n , e seguimos que n ∣ a ⋅ ( x - y ) , ou seja, n divide a ⋅ ( x - y ) igualmente. Como n não compartilha divisores primos com a , isso significa que n ∣ x - y . Finalmente, porque - n < x - y < n , concluímos que x = y . Isso mostra que os produtos de uma ⋅a ⋅ ( x - y)%n = um ⋅ x%n - um ⋅ y%n = 0n ∣ a ⋅ ( x - y)na ⋅ ( x - y)numan ∣ x - y- n < x - y< nx = y são todos elementos diferentes de Z n . Como Z n tem exatamente n elementos, um (e exatamente um) desses produtos deve ser igual a 1 , ou seja, existe um b exclusivoem Z n de modo que a ⋅ n b = 1 .a⋅n0,…,a⋅n(n−1)ZnZnn1 bZna⋅nb=1
Por outro lado, corrija e deixe a ser um elemento de Z n que não é coprime para n . Nesse caso, existe um primo p tal que p ∣ a e p ∣ n . Se um admitido um módulo inverso multiplicativo n (vamos chamá-lo de b ), teríamos que a ⋅ n b = 1 , significando que a ⋅ bn>1aZnnpp∣ap∣nanba⋅nb=1 e, portanto, ( a ⋅ b - 1 )a⋅b%n=1 , então n ∣ a ⋅ b - 1 . Desde p ∣ a , seguimos que p ∣ a ⋅ b . Por outro lado, desde p ∣ n , seguimos também p ∣ a ⋅ b - 1 . Dessa forma, p ∣ ( a ⋅ b ) - ( a ⋅ b - 1 ) = 1(a⋅b−1)%n=a⋅b%n−1=0n∣a⋅b−1p∣ap∣a⋅bp∣np∣a⋅b−1p∣(a⋅b)−(a⋅b−1)=1, o que contradiz a suposição de que é um número primo.p
Isso prova que as seguintes instruções são equivalentes quando .n>1
Como funciona
Para cada par de números inteiros e b em Z n , o número inteiro k : = um ⋅ n + b é única; de facto, um e b são quociente e o resto de k dividido por n , isto é, dada k , que podem recuperar um = k / n e b = kabZnk : = um ⋅ n + bumabknka = k / n , onde / denotadivisãointeira. Finalmente, uma vez que um ≤ n - 1 e b ≤ n - 1 , k é um elemento de Z n 2 ; de fato, k ≤ ( n - 1 ) ⋅ n + ( n - 1 ) = n 2 - 1 .b = k%n/a ≤ n - 1b ≤ n - 1kZn2k≤(n−1)⋅n+(n−1)=n2−1
Como observado acima, se e n forem coprime, haverá um b único, de modo que a ⋅ banb , ou seja, haverá um k únicoque k / n = a e k / n ⋅ ka⋅b%n=1kk/n=a , então a lista gerada conterá uma exatamente uma vez.k/n⋅k%n=(k/n)⋅(k%n)%n=1a
Por outro lado, se e n não são coprime, a condição k / n ⋅ kan será falso para todos os valores de k, de modo que a = k / n , portanto, a lista geradanãoconterá a .k/n⋅k%n=1ka=k/na
Isto prova que a lista dos lambda retorna irá conter todos 's coprimes em Z n exactamente uma vez.nZn
1\n3\n
) contam como saída válida?