lambda n:[k/n for k in range(n*n)if k/n*k%n==1]
Probieren Sie es online!
Hintergrund
Betrachten Sie den Ring . Während dieser Ring normalerweise unter Verwendung der Restklassen modulo , kann er auch als die Menge , wobei die Additions- und Multiplikationsoperatoren durch und , wobei die übliche Addition bezeichnen, Multiplikation und Modulo-Operatoren über die ganzen Zahlen.n Z n = { 0 , … , n - 1 } a + n b = ( a + b )(Zn,+n,⋅n)nZn={0,…,n−1}a ⋅ n b = a ⋅ ba+nb=(a+b)%n+ ,a⋅nb=a⋅b%n+,⋅, and %
Zwei Elemente und von heißen gegenseitige multiplikative Inversen modulo wenn . Beachten Sie, dass wenn .b Z n n a ≤ n b = 1abZnn1a⋅nb=1%nn > 11%n=1n>1
Fixiere und sei ein Koprime von in . Wenn für zwei Elemente und von , haben wir das . Dies impliziert, dass , und wir folgen diesem , dh teilt gleichmäßig auf. Da keine Primteiler mit teilt , bedeutet dies, dass . Endlich, weila n Z n a ≤ n x = a ≤ n y x y Z n a ≤ xn>1anZna⋅nx=a⋅nyxyZna ⋅ ( x - y )a⋅x%n=a⋅y%nn ∣ a ⋅ ( x - y ) n a ⋅ ( x - y ) n a n ∣ x - y - n < x - y < n x = y a ⋅ n 0 , ... , a ⋅ n ( n - 1 ) Z n Z n n 1 b Za⋅(x−y)%n=a⋅x%n−a⋅y%n=0n∣a⋅(x−y)na⋅(x−y)nan∣x−y−n<x−y<n , wir schließen daraus, dass . Dies zeigt, dass die Produkte alle verschiedene Elemente von . Da genau Elemente hat, muss eines (und genau eines) dieser Produkte gleich , dh es gibt ein eindeutiges in so dass .x=ya⋅n0,…,a⋅n(n−1)ZnZnn1 b a ≤ n b = 1Zna⋅nb=1
umgekehrt und lasse ein Element von , das nicht zu ist . In diesem Fall gibt es eine Primzahl , so daß und . Wenn eine multiplikative Inverse Modulo zugelassen (nennen wir es ), wir haben würde , was bedeutet , dass und daher , also . Seit folgen wir dema Z n n p p | a p | n a n b eine ⋅ n b = 1 eine ⋅ bn>1aZnnpp∣ap∣nanba⋅nb=1( a ⋅ b - 1 )a⋅b%n=1n | a ⋅ b - 1 p | a p | a ⋅ b p | n p | a ⋅ b - 1 p | ( a ⋅ b ) - ( a ⋅ b - 1 ) = 1 p(a⋅b−1)%n=a⋅b%n−1=0n∣a⋅b−1p∣ap∣a⋅b . Andererseits folgen wir seit auch diesem . Auf diese Weise ist , was der Annahme widerspricht, dass eine Primzahl ist.p∣np∣a⋅b−1p∣(a⋅b)−(a⋅b−1)=1p
Dies beweist, dass die folgenden Aussagen äquivalent sind, wenn .n>1
Wie es funktioniert
Für jedes Paar von ganzen Zahlen und in ist die ganze Zahl eindeutig; Tatsächlich sind und Quotient und der Rest von geteilt durch , dh wenn , können wir und , wobei eine ganzzahlige Division bedeutet. Schließlich ist , da und , ein Element von ; in der Tat ist .b Z n k : = a ⋅ n + b a b k n k ein = k / n b = kabZnk:=a⋅n+babknka=k/n/ a ≤ n - 1 b ≤ n - 1 k Z n 2 k ≤ ( n - 1 ) ⋅ n + ( n - 1 ) = n 2 - 1b=k%n/a≤n−1b≤n−1kZn2k≤(n−1)⋅n+(n−1)=n2−1
Wie oben erwähnt, gibt es , wenn und Koprime sind, ein eindeutiges so dass , dh es gibt ein eindeutiges so dass und , so wird die erzeugte Liste enthält genau einmal.n b a ⋅ banba⋅b%n=1kk/n=ak/n⋅k%n=(k/n)⋅(k%n)%n=1a
Umgekehrt, wenn und sind nicht coprime, die Bedingung für alle Werte von falsch sein derart , daß , so dass die erzeugte Liste wird nicht enthalten .ank/n⋅k%n=1ka=k/na
Dies beweist, dass die Liste, die das Lambda zurückgibt, genau einmal alle Koprime von in .Z nnZn
1\n3\n
Zählen einzelne Strings (zB ) als gültige Ausgabe?