COMPLEX Algorithmes Probabilistes Ludovic Perret UPMC Univ. Paris 06 & INRIA LIP6 Introduction Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Introduction Algorithme Déterministe Il retourne toujours une solution correcte, et pour une même entrée, il retourne toujours la même réponse (et toujours avec la même complexité) https://openclassrooms.com/ Introduction Algorithme Probabiliste Pour une même entrée, l’algorithme ne retourne pas toujours la même réponse (et pas toujours avec la même complexité) la sortie n’est pas forcément correcte https://www.authenticfx.com/ Introduction Las-Vegas Définition Un algorithme de type Las-Vegas est un algorithme probabiliste qui retourne toujours un résultat correct Le temps d’exécution peut varier ; la complexité d’un algorithme de Las-Vegas est une variable aléatoire QuickSort avec pivot aléatoire Θ(n2 ) dans le pire cas, Θ(log(n) · n) en moyenne. http://instants-captures.fr/ Introduction Monte-Carlo Définition Un algorithme de type Monte-Carlo est un algorithme qui termine toujours en temps polynomial Le résultat n’est pas toujours correct, mais on contrôle la probabilité d’erreur http://www.casinosenfrance.net/ Primalité Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Primalité Motivation Contexte Cryptographie à clef publique ≡ fonction à sens unique avec trappe. Problème difficile (dans NP). FACT Entrée : un entier non nul N ∈ N Question : trouver un diviseur non-trivial p de N PREMIER Entrée : un entier non nul N ∈ N Question : N est-il premier ? http://viterbi.usc.edu/ Primalité Primalité Génération de Grands Premiers Soit π(N ) = {n ∈ [1, . . . , N ] | N premier}. Alors : π(N ) ≈N →∞ N . log(N ) Primalité Primalité Génération de Grands Premiers Soit π(N ) = {n ∈ [1, . . . , N ] | N premier}. Alors : π(N ) ≈N →∞ Historique PREMIER ∈ NP. N . log(N ) Primalité Primalité Génération de Grands Premiers Soit π(N ) = {n ∈ [1, . . . , N ] | N premier}. Alors : π(N ) ≈N →∞ N . log(N ) Historique PREMIER ∈ NP. Tests de primalité probabilistes. Si TestPREMIER(N ) retourne composé, alors N est toujours composé Si TestPREMIER(N ) retourne premier, alors N est peut être premier Primalité Primalité Génération de Grands Premiers Soit π(N ) = {n ∈ [1, . . . , N ] | N premier}. Alors : π(N ) ≈N →∞ N . log(N ) Historique PREMIER ∈ NP. Tests de primalité probabilistes. Si TestPREMIER(N ) retourne composé, alors N est toujours composé Si TestPREMIER(N ) retourne premier, alors N est peut être premier Algorithme déterministe en O (log(N )15/2+ε ), pour ε > 0. M. Agrawal, N. Kayal, N. Saxena. “PRIMES is in P”. Annals of Mathematics, 2004. Primalité Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Arithmétiques dans ZN Primalité Arithmétiques dans ZN L’ensemble des entiers modulaires Deux entiers a et b sont dits congruents modulo N, notés a ≡ b mod N si, et seulement si : N | a − b. Définition ZN = {0, . . . , N − 1}. http://fr.123rf.com/ Addition/Soustraction ⊕ 0 1 2 Pour tout a, b ∈ ZN : 0 0 1 2 a ⊕ b = s avec s ≡ (a + b) mod N . 1 1 2 0 a b = s avec s ≡ (a − b) mod N . 2 2 0 1 Complexité : O (log(N )). Z3 = {0, 1, 2} Primalité Arithmétiques dans ZN Multiplication dans ZN Multiplication ⊗ 0 1 2 Pour a, b dans ZN : a ⊗ b = s avec s ≡ (a × b) mod N . Complexité : O (log2 (N )). 0 0 0 0 1 0 1 2 2 0 2 1 Z3 = {0, 1, 2} ⊗ 0 1 2 3 0 0 0 0 0 1 0 1 2 3 2 0 2 0 2 3 0 3 2 1 Z4 = {0, 1, 2, 3} Primalité Arithmétiques dans ZN Éléments Inversibles Théorème Soit x ∈ ZN , alors x est inversible modulo N si et seulement si pgcd(x , N ) = 1. La complexité du pgcd est en O (log2 (N )). Définition L’ensemble des éléments inversibles modulo N est noté Z× N. Pour un entier N ∈ Z, on note : ϕ(N ) = #{x ∈ [1, . . . , N − 1] | pgcd(x , N ) = 1}. Si p est premier, ϕ(p) = p − 1. Primalité Arithmétiques dans ZN Calcul de l’inverse modulaire Proposition 2 Calculer l’inverse modulo N de x ∈ Z× N est en O (log (N )). Principe Il existe (u , v ) t.q. u · x + v · N = pgcd(x , N ) = 1, c’est à dire : u ·x ≡ 1 mod N . Calculer l’inverse de x, c’est donc calculer u (et v ). On utilise l’algorithme d’Euclide étendu. Proposition Soient a ∈ ZN et k < N, on calcule ak mod N en O (log3 (N )). Primalité Arithmétiques dans ZN Euler/Fermat Théorème (Fermat) Soient N premier et un entier a ∈ Z. Nous avons : aN ≡ a mod N . Si pgcd(a, N ) = 1, alors : aN −1 ≡ 1 mod N . Primalité Arithmétiques dans ZN Euler/Fermat Théorème (Fermat) Soient N premier et un entier a ∈ Z. Nous avons : aN ≡ a mod N . Si pgcd(a, N ) = 1, alors : aN −1 ≡ 1 mod N . Théorème (Euler) Soient N ≥ 2 et un entier a ∈ Z tel que pgcd(a, N ) = 1. Nous avons : aϕ(N ) ≡ 1 mod N . Tests de Primalité Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Tests de Primalité Test de Fermat Test de Fermat – (I) Principe Général des Tests Condition calculatoirement facile à vérifier qui caractérise les premiers. Test probabiliste ≡ condition nécessaire. Test déterministe AKS ≡ condition nécessaire et suffisante. Tests de Primalité Test de Fermat Test de Fermat – (I) Principe Général des Tests Condition calculatoirement facile à vérifier qui caractérise les premiers. Test probabiliste ≡ condition nécessaire. Test déterministe AKS ≡ condition nécessaire et suffisante. Théorème (Fermat) Soit N premier. Alors, pour tout entier a tel que pgcd(a, N ) = 1 : aN −1 ≡ 1 mod N . Tests de Primalité Test de Fermat Test de Fermat – (I) Principe Général des Tests Condition calculatoirement facile à vérifier qui caractérise les premiers. Test probabiliste ≡ condition nécessaire. Test déterministe AKS ≡ condition nécessaire et suffisante. Théorème (Fermat) Soit N premier. Alors, pour tout entier a tel que pgcd(a, N ) = 1 : aN −1 ≡ 1 mod N . Soit a, 1 < a < N tel que pgcd(a, N ) = 1 et aN −1 6≡ 1 mod N alors N est composé et a est un témoin de Fermat Si N est un entier composé impair et a, 1 < a < N. Alors, N est pseudo-premier en base a si aN −1 ≡ 1 mod N . Tests de Primalité Test de Fermat Test de Fermat TestFermat(N ) Choisir aléatoirement a ∈ [2, . . . , N − 1] Si pgcd(a, N ) > 1 retourner composé. Calculer Reste ≡ aN −1 mod N Si Reste 6≡ 1 mod N alors retourner composé. Retourner premier Complexité O log3 (N ) . Tests de Primalité Test de Fermat Test de Fermat TestFermat(N ) Choisir aléatoirement a ∈ [2, . . . , N − 1] Si pgcd(a, N ) > 1 retourner composé. Calculer Reste ≡ aN −1 mod N Si Reste 6≡ 1 mod N alors retourner composé. Retourner premier Caractéristiques Si TestFermat(N ) retourne composé alors N n’est pas premier. Si TestFermat(N ) retourne premier, alors N est peut être premier. L’algorithme échoue pour les a tels que pgcd(a, N ) = 1, aN −1 ≡ 1 mod N mais N composé. Ce sont les a tels que N est pseudo-premier en base a (par exemple, 341 = 11 · 31 pour a = 2). Tests de Primalité Test de Fermat Nombres de Carmichaël Définition Un nombre de Carmichaël est un entier N composé qui ∀a ∈ [2, . . . , N − 1] avec pgcd(a, N ) = 1 est pseudo-premier en base a. Tests de Primalité Test de Fermat Nombres de Carmichaël Définition Un nombre de Carmichaël est un entier N composé qui ∀a ∈ [2, . . . , N − 1] avec pgcd(a, N ) = 1 est pseudo-premier en base a. TestFermat(N ) échoue donc systématiquement si N est un nombre de Carmichaël. + petit nombre de Carmichaël est 561 = 3 · 11 · 17. Densité des Nombres de Carmichaël [Harman, 2002] Soit C (N ) le nombre d’entiers de Carmichaël ≤ N, alors ∃β > 0.33 : C (N ) > N β , pour N ”suffisamment” grand. C (1014) = 44706, et d10140.33 e = 41687 Tests de Primalité Test de Fermat Nombres de Carmichaël Définition Un nombre de Carmichaël est un entier N composé qui ∀a ∈ [2, . . . , N − 1] avec pgcd(a, N ) = 1 est pseudo-premier en base a. Prn∈[1,...,N ] (n est de Carmichaël) ≤ C (N ) 1 ≤ 0.66 . N N Tests de Primalité Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Test de Rabin-Miller Tests de Primalité Test de Rabin-Miller Rabin-Miller Lemme Soient N un premier et X un entier positif. Si X 2 ≡ 1 mod N alors X ≡ ±1 mod N. Tests de Primalité Test de Rabin-Miller Rabin-Miller Lemme Soient N un premier et X un entier positif. Si X 2 ≡ 1 mod N alors X ≡ ±1 mod N. Théorème Soit N un premier. Nous écrivons N − 1 = r · 2s , avec r impair et s ≥ 0. Soit a ∈ Z tel que pgcd(a, N ) = 1, alors : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . Tests de Primalité Test de Rabin-Miller Rabin-Miller Théorème Soit N un premier. Nous écrivons N − 1 = r · 2s , avec r impair et s ≥ 0. Soit a ∈ Z tel que pgcd(a, N ) = 1, alors : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . N composé si ∃a, 1 < a < N tel que pgcd(a, N ) = 1 et j ar 6≡ 1 mod N et ∀j , 0 ≤ j ≤ s − 1 tel que a2 r 6≡ −1 mod N . Tests de Primalité Test de Rabin-Miller Rabin-Miller Théorème Soit N un premier. Nous écrivons N − 1 = r · 2s , avec r impair et s ≥ 0. Soit a ∈ Z tel que pgcd(a, N ) = 1, alors : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . N composé si ∃a, 1 < a < N tel que pgcd(a, N ) = 1 et j ar 6≡ 1 mod N et ∀j , 0 ≤ j ≤ s − 1 tel que a2 r 6≡ −1 mod N . Définition Soient N un entier composé impair et a, 1 < a < N tel que pgcd(a, N ) = 1. On écrit N − 1 = r · 2s , avec r impair. Nous dirons que N est pseudo-premier fort en base a si : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . Tests de Primalité Test de Rabin-Miller Rabin-Miller Théorème Soit N un premier. Nous écrivons N − 1 = r · 2s , avec r impair et s ≥ 0. Soit a ∈ Z tel que pgcd(a, N ) = 1, alors : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . Définition Soient N un entier composé impair et a, 1 < a < N tel que pgcd(a, N ) = 1. On écrit N − 1 = r · 2s , avec r impair. Nous dirons que N est pseudo-premier fort en base a si : j ar ≡ 1 mod N ou ∃j , 0 ≤ j ≤ s − 1 tel que a2 r ≡ −1 mod N . Théorème Soit N un entier impair composé. Il existe au plus N /4 entiers a, 1 < a < N tel que N est pseudo-premier fort en base a. Tests de Primalité Test de Rabin-Miller Test de Rabin-Miller RabinMiller(N ) Choisir aléatoirement a ∈ [2, . . . , N − 1] Si pgcd(a, N ) > 1 retourner composé Trouver (r , s) tel que N − 1 = r · 2s avec r impair Calculer Reste ≡ ar mod N Si Reste 6≡ ±1 mod N alors j ←1 Tant que j ≤ s − 1 et Reste 6≡ −1 mod N faire Reste ← Reste2 mod N Si Reste ≡ 1 mod N alors retourner composé j ← j +1 FinTantQue Si Reste 6≡ −1 mod N alors retourner composé retourner premier. Complexité O log3 (N ) . Tests de Primalité Test de Rabin-Miller Test de Rabin-Miller RabinMiller(N ) Choisir aléatoirement a ∈ [2, . . . , N − 1] Si pgcd(a, N ) > 1 retourner composé Trouver (r , s) tel que N − 1 = r · 2s avec r impair Calculer Reste ≡ ar mod N Si Reste 6≡ ±1 mod N alors j ←1 Tant que j ≤ s − 1 et Reste 6≡ −1 mod N faire Reste ← Reste2 mod N Si Reste ≡ 1 mod N alors retourner composé j ← j +1 FinTantQue Si Reste 6≡ −1 mod N alors retourner composé retourner premier. Caractéristiques Si RabinMiller(N ) retourne composé alors N n’est pas premier. Si RabinMiller(N ) retourne premier, alors N est peut être premier. Tests de Primalité Test de Rabin-Miller Test de Rabin-Miller RabinMiller(N ) Choisir aléatoirement a ∈ [2, . . . , N − 1] Si pgcd(a, N ) > 1 retourner composé Trouver (r , s) tel que N − 1 = r · 2s avec r impair Calculer Reste ≡ ar mod N Si Reste 6≡ ±1 mod N alors j ←1 Tant que j ≤ s − 1 et Reste 6≡ −1 mod N faire Reste ← Reste2 mod N Si Reste ≡ 1 mod N alors retourner composé j ← j +1 FinTantQue Si Reste 6≡ −1 mod N alors retourner composé retourner premier. Si RabinMiller(N ) retourne premier alors : PrN (RabinMiller(N )retourne premier | N est composé) ≤ 1 4 Polynomial Identity Testing Outline 1 Introduction 2 Primalité Arithmétiques dans ZN 3 Tests de Primalité Test de Fermat Test de Rabin-Miller 4 Polynomial Identity Testing Polynomial Identity Testing Motivation Soit n > 0 et une matrice de Vandermonde : 1 x1 1 x2 Vd(x1 , . . . , xn ) = . 1 .. 1 xn . . . x1n−1 . . . x2n−1 .. ... . . . . xnn−1 Polynomial Identity Testing Motivation Soit n > 0 et une matrice de Vandermonde : 1 x1 1 x2 Vd(x1 , . . . , xn ) = . 1 .. 1 xn . . . x1n−1 . . . x2n−1 .. ... . . . . xnn−1 On sait montrer mathématiquement : Det Vd(x1 , . . . , xn ) = ∏ 1≤i <j ≤n (xj − xi ). Polynomial Identity Testing Motivation Soit n > 0 et une matrice de Vandermonde : . . . x1n−1 . . . x2n−1 .. ... . . . . xnn−1 1 x1 1 x2 Vd(x1 , . . . , xn ) = . 1 .. 1 xn On sait montrer mathématiquement : Det Vd(x1 , . . . , xn ) = ∏ (xj − xi ). 1≤i <j ≤n On souhaite vérifier l’identité : Det Vd(x1 , . . . , xn ) − ∏ 1≤i <j ≤n (xj − xi ) = 0. Polynomial Identity Testing Motivation On souhaite vérifier l’identité : Det Vd(x1 , . . . , xn ) − ∏ (xj − xi ) = 0. 1≤i <j ≤n Pour n = 2, Det Vd(x1 , x2 ) = x2 − x1 . est un poly. de degré ≈ 5000 avec 25000 termes. Pour n = 100, Det Vd(x1 , . . . , x100 ) est un poly. de degré ≈ 5000 avec 25000 termes. Polynomial Identity Testing Motivation On souhaite vérifier l’identité : Det Vd(x1 , . . . , xn ) − ∏ (xj − xi ) = 0. 1≤i <j ≤n Définition K[x1 , . . . , xn ] l’ensemble des polynômes en les variables x1 , . . . , xn dont les coefficients sont dans K Un monôme est un produit de puissances des variables, i.e. x1α1 · · · xnαn . Le degré d’un monôme x1α1 · · · xnαn est ∑ni=1 αi . Le nombre de monômes de degré ≤ d en n variables n +d d ∈ O (nd ). Polynomial Identity Testing Polynomial Idendity Testing Définition Soit f ∈ K[x1 , . . . , xn ] de degré d > 0. Nous dirons que f est donné par une boîte noire s’il est possible d’évaluer f efficacement, i.e. en temps polynomial (sans forcement accéder à ses coefficients). https://en.wikipedia.org/wiki/Black_box Ex : Det Vd(x1 , . . . , xn ) . PIT Entrée : un polynôme f ∈ K[x1 , . . . , xn ] de degré d > 0 donné par une boîte-noire. Question : Est-ce que le polynôme f est nul ? Polynomial Identity Testing PIT – Cas Univarié UnivPIT Entrée : un polynôme f ∈ K[X ] de degré d > 0 donné par une boîte-noire. Question : Est-ce que le polynôme f est nul ? Polynomial Identity Testing PIT – Cas Univarié UnivPIT Entrée : un polynôme f ∈ K[X ] de degré d > 0 donné par une boîte-noire. Question : Est-ce que le polynôme f est nul ? Lemme Il existe une algorithme polynomial déterministe pour résoudre UnivPIT. Polynomial Identity Testing PIT – Cas Univarié UnivPIT Entrée : un polynôme f ∈ K[X ] de degré d > 0 donné par une boîte-noire. Question : Est-ce que le polynôme f est nul ? Lemme Il existe une algorithme polynomial déterministe pour résoudre UnivPIT. Démonstration. Si f est non nul, alors d s’annule sur au plus d points distincts. L’algorithme consiste à évaluer le polynôme f sur d + 1 poins distincts r1 , . . . , rn+1 ∈ K. Si f (ri ) = 0, pour tout i , 1 ≤ i ≤ n + 1, alors nous pouvons dire que f est nul. Sinon, f est nul. Polynomial Identity Testing PIT – Cas Général Lemme de Schwartz-Zippel-DeMillo-Lipton Soit f ∈ K[x1 , . . . , xn ] de degré d > 0, et S ⊆ K. Si f est non-nul, alors : d Pr(r1 ,...,rn )∈S n f (r1 , . . . , rn ) = 0 ≤ , |S | avec |S | qui dénote la taille d’un sous-ensemble fini S ⊆ K. Polynomial Identity Testing The Curious History of the Schwartz-Zippel Lemma https://rjlipton.wordpress.com/2009/11/30/the-curious-history-of-the-schwartz-zippel-lemma/ Polynomial Identity Testing The Curious History of the Schwartz-Zippel Lemma Richard A. DeMillo, Richard J. Lipton. “A Probabilistic Remark on Algebraic Program Testing". Inf. Process. Lett. 1978. Jacob T. Schwartz. “Probabilistic Algorithms for Verification of Polynomial Identities (invited)". International Symposium on Symbolic and Algebraic Computation, 1979. Richard Zippel. “Probabilistic Algorithms for Sparse Polynomials". International Symposium on Symbolic and Algebraic Computation, 1979. Polynomial Identity Testing PIT – Cas Général Lemme de Schwartz-Zippel-DeMillo-Lipton Soit f ∈ K[x1 , . . . , xn ] de degré d > 0, et S ⊆ K. Si f est non-nul, alors : d Pr(r1 ,...,rn )∈S n f (r1 , . . . , rn ) = 0 ≤ , |S | avec |S | qui dénote la taille d’un sous-ensemble fini S ⊆ K. Polynomial Identity Testing PIT – Cas Général Lemme de Schwartz-Zippel-DeMillo-Lipton Soit f ∈ K[x1 , . . . , xn ] de degré d > 0, et S ⊆ K. Si f est non-nul, alors : d , Pr(r1 ,...,rn )∈S n f (r1 , . . . , rn ) = 0 ≤ |S | avec |S | qui dénote la taille d’un sous-ensemble fini S ⊆ K. Démonstration. Cas de base. Pour n = 1, un polynôme univarié possède au plus d racines distinctes. Polynomial Identity Testing PIT – Cas Général Démonstration. Induction. Soit f ∈ K[x1 , . . . , xn ] de degré d > 0 non nul. On dénote par k la plus grande puissance de x1 qui divise les monômes de f . k f= ∑ x1i · fi (x2 , . . . , xn ). i =0 Par définition, fk est non-nul et de degré ≤ d − k . Par hypothèse d’induction : d −k . Pr(r2 ,...,rn )∈S n−1 fk (r2 , . . . , rn ) = 0 ≤ |S | Polynomial Identity Testing PIT – Cas Général Démonstration. Soient A l’événement “f (r1 , . . . , rn ) = 0” et B l’événement “fk (r2 , . . . , rn ) = 0”. Clairement, A = (A ∩ B ) ∪ (A ∩ B̄ ) et Pr(A) = Pr(A ∩ B ) + Pr(A ∩ B̄ ) Pr(A) = Pr(A|B )Pr(B ) + Pr(A|B̄ )Pr(B̄ ) Pr(A) ≤ Pr(B ) + Pr(A|B̄ ). Nous avons : d −k . Pr(B ) = Pr(r2 ,...,rn )∈S n−1 fk (r2 , . . . , rn ) = 0 ≤ |S | Polynomial Identity Testing PIT – Cas Général Démonstration. Soit (r2 , . . . , rn ) ∈ S n−1 . On pose : k p(x1 ) = f (x1 , r2 , . . . , rn ) = ∑ x1i · fi (r2 , . . . , rn ). i =0 Si “fk (r2 , . . . , rn ) 6= 0”, alors p est un polynôme univarié non-nul de degré k . Finalement : Pr(A) ≤ Pr(B ) + Pr(A|B̄ ) ≤ d −k k d + ≤ . |S | |S | |S | Polynomial Identity Testing Résolution du PIT Proposition Soit K fini, et f ∈ K[x1 , . . . , xn ] de degré d > |K|. Il existe une algorithme polynomial probabiliste pour résoudre PIT. Si l’algorithme retourne non-zero, alors f est bien non nul. Si l’algorithme retourne zero, alors f est d . nul avec probabilité ≤ |K| Si K est infini, avec probabilité ≤ ε , pour tout 0 < ε < 1. Polynomial Identity Testing Résolution du PIT Proposition Soit K fini, et f ∈ K[x1 , . . . , xn ] de degré d > |K|. Il existe une algorithme polynomial probabiliste pour résoudre PIT. Si l’algorithme retourne non-zero, alors f est bien non nul. Si l’algorithme retourne zero, alors f est d . nul avec probabilité ≤ |K| Si K est infini, avec probabilité ≤ ε , pour tout 0 < ε < 1. Démonstration. On évalue le polynôme f sur un point (r1 , . . . , rn ) ∈ Kn tiré aléatoirement. Si f (r1 , . . . , rn ) 6= 0, alors l’algorithme retourne non-zero. Si f (r1 , . . . , rn ) = 0, alors l’algorithme retourne zero. Finalement, si f est non-nul, alors : d Pr(r1 ,...,rn )∈Kn f (r1 , . . . , rn ) = 0 ≤ . |K|