Download
slide1 n.
Skip this Video
Loading SlideShow in 5 Seconds..
Algoritmusok bonyolults ága és kommunikációs bonyolultság Gáspár Merse Előd fizika szeminárium PowerPoint Presentation
Download Presentation
Algoritmusok bonyolults ága és kommunikációs bonyolultság Gáspár Merse Előd fizika szeminárium

Algoritmusok bonyolults ága és kommunikációs bonyolultság Gáspár Merse Előd fizika szeminárium

96 Vues Download Presentation
Télécharger la présentation

Algoritmusok bonyolults ága és kommunikációs bonyolultság Gáspár Merse Előd fizika szeminárium

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Algoritmusok bonyolultsága és kommunikációs bonyolultság Gáspár Merse Előd fizika szeminárium 2004 szeptember

  2. A bonyolultságelmélet alapvető részei • algoritmus, idő, tár stb. pontos fogalma matematikai gép különböző modelljei • erőforrások korlátozása –> megoldható feladatok körének szűkülése –> bonyolultsági osztályok • legfontosabb algoritmusok erőforrás-igényei? • hatékony algoritmusok arra, hogy fontos feladatokról eldönsük melyik bonyolultsági osztályba tartoznak

  3. „negatív eredmények” bizonyítása: egyes feladatok nem oldhatók meg bizonyos erőforrás- korlátozások mellett (bonyolultsági osztályok különbözőek-e, üresek-e?) • „negatív eredmények” (bonyolult problémák és struktúrák) felhasználása: véletlen számok generálása, kommunikációs protokollok, titkosírások (kriptográfia), adatvédelem

  4. A matematikai gép különböző fajtái • Véges automata (bonyolultságelmélet számára túlságosan primitív) • Turing-gép (megalkotója Turing angol matematikus még a programvezérlésű számítógépek előtt, 1936) Matematikailag tiszta, de leírása nehézkes, ezért inkább elméleti vizsgálatokban használjuk. Turing-gépen minden számítás elvégezhető, ami bármilyen más azóta definiált matematikai gépen. A valódi számítógépektől több vonatkozásban eltér, pl. memóriája nem közvetlen elérésű.

  5. Alan Turing (1912-1954) • Turing-gép • Church-Turing-tézis • Enigma feltörése • Turing-teszt

  6. RAM-gép (Random Acces Machine) A memória tetszőleges rekesze egy lépésben elérhető. A valódi számítógépek leegyszerűsített modellje azzal az absztrakcióval, hogy memóriája korlátlan, és minden memóriarekeszében tetszőlegesen nagy egész tárolható. RAM-gépen ugyanazok a függvények számíthatók ki, mint Turing-gépen. • Logikai hálózatok Rögzített méretű bemenet esetén minden függvény kiszámítható logikai hálózattal, de egy adott hálózat csak adott nagyságú bemenetet enged meg.

  7. Turing-gép alkotórészei • k ≥ 1 két irányban végtelen szalag. Minden szalagnak van egy kitüntetett kezdőmezeje (0. mező). A mezőkre egy véges Σ ábécéből lehet jelet írni. Véges sok mező kivételével ez a jel az üres mező jele („#”) kell legyen. • Minden szalaghoz tartozik egy író-olvasó fej, mely minden lépésben a szalag egy mezején áll. • Vezérlőegység, melynek állapotai egy véges Γ halmazt alkotnak. Ki van tüntetve egy „START” kezdőállapot és egy „STOP” végállapot.

  8. Az ideális Turing-gép

  9. Turing-gép működése • Kezdetben a vezérlőegység a START állapotban van, a fejek pedig a szalagok kezdőmezőjén. • Minden lépésben minden fej leolvassa a szalagján lévő jelet, és a vezérlőegység a leolvasott jelektől és a saját állapotától függően 3 dolgot csinál: » átmegy egy új állapotba (ez lehet a régi is) » utasítást ad a fejeknek, hogy az adott mezőn lévő jelet fölülírják (v. speciálisan azt, hogy ne írják fölül) » minden fejnek utasítást ad, hogy lépjen jobbra v. balra egyet, vagy maradjon helyben • A gép megáll, ha a vezérlőegység a STOP állapotba jut.

  10. A Turing-gép paraméterei T = (k,Σ,Γ,φ,ψ,δ) • k ≥ 1 egész • Σ és Γ véges halmazok, #є Σ és START, STOP є Γ • φ: Γ×Σk —> Γ • ψ: Γ×Σk —> Σk • δ: Γ×Σk —> {-1,0,1}

  11. Megjegyzések: • Σ a # jelen kívűl általában még legalább 2 jelet (0,1) tartalmaz, és általában ennyi elegendő is. • Gyakran a szalagok csak egy irányban végtelenek, és számuk szinte mindig könnyen korlátozható volna 2-re, és igen sok vonatkozásban 1-re is. • Bizonyos szalagokról kiköthető volna, hogy azok csak írhatók vagy csak olvashatók. • Bemeneten általában az induláskor a szalagra írt Σ ábécé beli szavakat értjük, míg kimeneten a végállapotban a szalagon lévő szavakat, vagy az utolsó szalagon lévő szót.

  12. Az univerzális Turing-gép gondolata Az eddigiek alapján egy lényeges különbséget vehetünk észre a Turing-gépek és a valódi programvezérlésű számítógépek között: Minden függvény kiszámításához külön Turing-gépet kell konstruálni, míg a számítógépeken elegendő megfelelő programot írni. Megmutatjuk, hogy a Turing-gépet is lehet így kezelni. Ez vezet az univerzális Turing-gép fogalmához!

  13. Univerzális Turing-gép Legyen T = (k+1,Σ,ΓT,φT,ψT,δT) és S = (k,Σ,ΓS,φS,ψS,δS) két Turing-gép. Legyen p egy Σ ábécé beli szó. Azt mondjuk, hogy T a p programmal szimulálja S-et, ha tetszőleges x1, x2, … , xk szavakra T az (x1, x2, … , xk, p) bemenete csakkor áll meg véges számú lépésben, ha S az (x1, x2, … , xk) bementre megáll, és megálláskor T első k szalagján rendre ugyanaz áll, mint S szalagjain.

  14. A k+1 szalagos T Turing-gép univerzális a k szalagos Turing-gépekre nézve, ha bármely k szlagos Σ fölötti S Turing-géphez létezik olyan p szó (program), mellyel a T szimulálja S-et. Tétel: Minden k ≥ 1 számhoz és minden Σ ábécéhez létezik k+1 szalagú univerzális Turing-gép. Bizonyitás vázlat: A konstrukció alapgondolata az, hogy a (k + 1)-edik szalagra a szimuláló S Turing-gép működését leíró táblázatot írunk. Az univerzális Turing-gép ezen kívűl még felírja magának, hogy a szimulált S gép melyik állapotában van éppen.

  15. A következő tétel azt mutatja, hogy nem lényeges, hogy hány szalagja van egy Turing-gépnek. Tétel: Minden k szalagos S Turing-géphez van olyan 1 szalagos Turing-gép, ami S-et helyettesíti a következő értelemben: minden Σ ábécé beli szóra S csakkor áll meg véges sok lépésben, ha T megáll ugyanerre a szóra, és megálláskor S utolsó szalagjára ugyanaz lesz írva, mint T szalagjára. Továbbá, ha S N lépést tesz, akkor T-nek O(N2) lépésre van szüksége. Megjegyzés: a bemenetet mindig írhatjuk 1 szalagra, S szalagjai csak a számítási idő lerövidítésére valók!

  16. Jelölések Legyen Σ egy véges ábécé, mely tartalmazza a „#” jelet. Turing-gépek bemeneteként olyan szavakat engedünk meg, melyek ezt a speciális üres mező jelet nem tartalmazzák. • Σ0 := Σ – {#} • Σ0* jelölje aΣ0fölötti szavak halmazát • Σ0* egy részhalmazát nyelvnek nevezzük

  17. Rekurzív és rekurzíve fölsorolható nyelvek Definíció: Egy f : Σ0* ―>Σ0* függvényt kiszámíthatónak vagy rekurzívnak nevezünk, ha van olyan T Turing-gép, ami bármely x єΣ0* bemenettel (vagyis első szalagjára x-et írva, a többit üresen hagyva) véges idő után megáll, és az első szalagjára az f(x) szó lesz írva. Definíció: Az L Σ0* beli nyelvet rekurzívnak hívjuk, ha karakterisztikus függvénye: fL(x) = {1, ha x єL ; 0, ha x єΣ0* - L} kiszámítható, ahol feltettük, hogy 0,1 єΣ0.

  18. Megjegyzések: • Nyilvánvaló, hogy minden véges nyelv rekurzív. • Ha L rekurzív, akkor a komplementere: Σ0* - L is az. • Mivel kontinuum sok nyelv van, míg a Turing-gépek száma megszámlálható, nyilvánvalóan létezik nem rekurzív nyelv is! Definíció: Egy L nyelvet rekurzíve fölsorolhatónak nevezünk, ha vagy L = Ø, vagy van olyan kiszámítható f : Σ0* ―>Σ0* függvény, melynek értékkészlete L. / Egy rekurzíve fölsorolható nyelv komplementere már nemfeltétlenül rekurzíve fölsorolható!/

  19. A rekurzív és rekurzíve fölsorolható nyelvek közötti kapcsolat Lemma: Egy L nyelv csakkor rekurzíve fölsorolható, ha van olyan T Turing-gép, melynek első szalagjára x-et írva, a gép csakkor áll le véges idő múlva, ha x єL. Tétel: Egy L nyelv csakkor rekurzív, ha mind az L nyelv, mind a Σ0* - L nyelv rekurzíve fölsorolható.

  20. A megállási probléma Most megmutatjuk, hogy van rekurzíve fölsorolható, de nem rekurzív nyelv. Legyen T Turing-gép. Álljon LTmindazon x єΣ0* szavakból, melyekre fennáll, hogy T minden szalagjára x-et írva, a gép véges sok lépésben megáll. Állítás: Az LTnyelv rekurzíve fölsorolható. De, ha T univerzális Turing-gép, akkor LTnem rekurzív.

  21. Mit is jelent ez? Röviden szólva: algoritmikusan nem lehet eldönteni, hogy egy univerzális Turing-gép egy adott bemenettel véges időn belül megáll-e Ezt a feladatot hívják megállási problémának. Megjegyzés: Algoritmikusan kiszámíthatónak azt nevezzük, amit Turing-gépen ki lehet számolni. Olyan determinisztikus modellt, amely több mindent tudna kiszámolni, mint a Turing-gép, még senki sem talált.

  22. Bizonyítás Az első állítás a Lemmából következik. A második állítás bizonyításához az egyszerűség kedvéért tegyük fel, hogy T-nek 2 szalagja van. Ha LTrekurzív volna, akkor Σ0* - LTrekurzíve fölsorolható volna, és így megadható volna olyan 1 szalagos T1 Turing- gép, hogy az x bemeneten csakkor áll le, ha x єΣ0* - LT. A T1 szimulálható T-n úgy, hogy 2. szalagjára egy alkalmas p „programot” írunk.

  23. Ekkor T mindkét szalagjára p-t írva, csakkor áll le, ha T1 leáll (a szimuláció miatt). T1 viszont csakkor áll le, ha T nem áll le ezzel a bemenettel, vagyis ha p nem eleme LT-nek. Tehát ellentmondás,hiszenLTdefiníciója szerint T pontosan akkor áll le, ha p eleme LT-nek. Q.E.D.

  24. Algoritmikusan eldönthetetlen problémák Példák: • Dominó-probléma • Hilbert 10. problémája, avagy a diophantoszi egyenletek megoldhatóságának problémája (egész együtthatós n változós polinomnak van-e egész számokból álló megoldása?)

  25. Tár és idő • timeT(n)a T Turing-géphez tartozó ún. időigény-függvény, mely a gép lépésszámának maximumát adja n hosszúságú bemenet esetén. Általában a gépnek el kell olvasnia a bemenetet,ezért timeT(n) ≥ n. • spaceT(n)a T Turing-géphez tartozó ún. tárigény-függvény, mely a gép szalagjain azon különböző mezők maximális számát adja, melyekre a gép ír n hosszúságú bemenet esetén. Nyilván spaceT(n) ≥ 1.

  26. Polinomiális Turing-gép Azt mondjuk, hogy a T Turing-gép polinomiális, ha időigénye O(f) valamely f polinomra, vagyis van olyan c > 0 konstans, hogy T időigénye O(nc). Megjegyzés: Hasonlóan definiálhatjuk az exponenciális idejű algoritmusokat (O((2n)c) időigényű valamely c > 0 konstans- ra), polinomiális tárigényű algoritmusokat (Turing-gépeket) stb.

  27. Nyelvosztályok Azt mondjuk, hogy a L Σ* beli nyelv időbonyolultsága legfeljebb f(n), ha a nyelv egy legfeljebb f(n) időigényű Turing-géppel eldönthető. A legfeljebb f(n) időbonyolultságú nyelvek osztályát DTIME(f(n))-nel jelöljük. (A „D” a determinisztikusra utal, később lesznek véletlent is használó algoritmusok.) A polinomiális Turing-géppel eldönthető nyelvek osztályát PTIME-mal vagy egyszerűen P-vel jelöljük. Hasonlóan definiálhatók a DSPACE(f(n)) nyelvosztályok és a DSPACE nyelvosztály.

  28. Nem-determinizmus alapgondolata Ha egy algoritmus megold egy problémát, akkor implicite arra is bizonyítékot szolgáltat, hogy a válasza helyes. Néha ez a bizonyíték sokkal egyszerűbb (rövidebb, áttekinthetőbb), mint a bizonyíték megtalálása, azaz az algoritmus futásának figyelemmel kísérése. Vizsgálhatjuk csupán a bizonyítékot annélkül, hogy törődnénk vele, hogyan lehet megtalálni.

  29. Ha tudjuk, hogy egy feladatra adott bizonyíték helyessége sem adható meg adott időn (vagy táron) belül, akkor az algoritmus bonyolultságára is alsó becslést kapunk. Aszerint osztályozva a feladatokat, hogy milyen nehéz a válaszra a helyességét rábizonyítani, igen érdekes és Alapvetőbonyolultsági osztályokat kapunk! Ez az a gondolat, melyet nem-determinizmusnak neveznek.

  30. Nem-determinisztikus Turing-gép Egy nem-determinisztikus Turing-gép annyiban különbözik egy determinisztiustól, hogy minden helyzetében több lehet- Séges lépés is megengedett a vezérlőegység állapotának és a fejek által leolvasott jelek függvényében. Legális számolásnaknevezzük a gép legális lépéseinek egy sorozatát.

  31. Nem-determinisztikus Turing-gép matematiai leírása T = (k,Σ,Γ,φ,ψ,δ) helyett T = (k,Σ,Γ,Φ), ahol φ: Γ×Σk —> Γ ψ: Γ×Σk —> Σk δ: Γ×Σk —> {-1,0,1} helyett Φ reláció:

  32. NTIME(f(n)), NSPACE(f(n)) Egy nem-determinisztikus Turing-gép t időben elfogadja az x єΣ0* szót, ha első szalagjára x-et írva (a többire az üres szót), van olyan legális számolás ezzel a bementtel, mely legfeljebb t lépésben megáll, és megálláskor az 1. szalag 0. poziciójában „1” áll. Azt mondjuk, hogy a T nem-determinisztikus Turing-gép föl- ismeri az L Σ0* beli nyelvet , ha L pontosan azokból a sza- vakból áll, melyeket T elfogad (akármekkora véges időben).

  33. Ha ezenfelül a gép minden x є L szót f(|x|) időben elfogad, akkor azt mondjuk, hogy a gép L-et f(n) időben ismeri föl. Az f(n) időben nem-determinisztikus Turing-géppel fölismer- hető nyelvek osztályát NTIME(f(n)) jelöli. Hasonlóan definiáljuk azt, hogy egy nem-determinisztikus Turing-gép az L nyelvet s tár föl-használásával fogadja el, illetve az f(n) tárral való fölismerhetőséget. Az f(n) tárral nem-determinisztikus Turing-géppel fölismer- hető nyelvek osztályát NSPACE(f(n)) jelöli.

  34. Co-NTIME(f(n)), co-NSPACE(f(n)) A determinisztikus osztályoktól eltérően, egy L nyelv nem- determinisztikus fölismerhetősége nem jelenti, hogy a komp- lementer nyelv (Σ0*- L) is fölismerhető (látni fogjuk, hogy erre minden rekurzíve fölsorolható, de nem rekurzív nyelv példa). Ezért értelmes bevezetni az alábbi nyelvosztályokat: Egy L nyelv akkor és csak akkor tartozik a co-NTIME(f(n)) ill. a co-NSPACE(f(n)) osztályba, ha a komplementer nyelv, azaz Σ0*- L, az NTIME(f(n)) ill. NSPACE(f(n)) osztályba tartozik.

  35. Megjegyzések A nem-determinisztikus Turing-gép egy szituációban többféle lépést is tehet, de ezeken a lépéseken nem tételezünk föl semmilyen valószínűségeloszlást. Ha ezt tennénk, akkor randomizált Turing-gépekről beszélnénk, melyek egyébként fontos gyakorlati jelentőséggel bírnak. Tétel: A nem-determinisztikus Turing-géppel fölismerhető nyelvek pontosan a rekurzíve fölsorolható nyelvek.

  36. A tanú Megmutatjuk, hogy az L nyelv nem-determinisztikus Turing- géppel bizonyos időben való fölismerhetősége azzal függ össze, hogy mennyire egyszerű „rábizonyítani” egy szóra, hogy L-ben van. Azt mondjuk, hogy L-nek f(n) hosszúságú g(n) idejű tanúja az L0є DTIME(g(n)) nyelv, ha x є L csakkor, ha van olyan x єΣ0*szó, hogy |y| ≤ f(|x|)és x&yєL0 (ahol „&” egy új jel, ami az x és y szavak elválasztására szolgál).

  37. NP, co-NP Tétel: Tetszőleges L Σ0*beli nyelvre az alábbi tulajdonságok ekvivalensek: • L fölismerhető nem-determinisztikus Turing-gépen polinomiális időben. • L-nek van polinomiális hosszúságú és idejű tanúja. A kimondott tulajdonsággal rendelkező nyelvek osztályát NP- vel jelöljük. Azon nyelvek, melyekre Σ0*- L є NP, alkotják a co-NP osztályt.

  38. Megjegyzések Pontos megfogalmazás nélkül megemlítjük, hogy L є NP ek- vivalens azzal is, hogy az L nyelvnek adható a halmazelmélet axiómarendszerében olyan definíciója, hogy minden x є L szóra az az állítás, hogy „ x є L” bebizonyítható a halmazel- mélet axiómáiból |x|-ben polinomiális lépésben. Savitch tétele: PSPACE=NPSPACE.

  39. Példák NP-beli nyelvekre Számos fontos nyelv a tanújával van megadva: • Gráf összefüggősége. Tanú: n(n-1)/2 út, minden pontpárra egy-egy. • Összetettség. Tanú: valódi osztó. • Hamilton-kör létezése. Tanú: a Hamilton-kör. • Síkba nem rajzolhatóság. Tanú: teljes ötszög v. három- ház-három-kút részgráf (Kuratowski-tétele alapján). • Stb.

  40. Polinomiális visszavezethetőség Azt mondjuk, hogy az L1 Σ1*beli nyelv polinomiálisan vissza- vezethető az L2 Σ2*beli nyelvre, ha van olyan polinomiális időben kiszámítható f : Σ1*—> Σ2*függvény, hogy minden xєΣ1*szóra xєL1 ekvivalensf(x)єL2–vel. A definíció alapján a polinomiálisan visszavezethetőség tran- zitív tulajdonság. Állítás: Ha egy nyelv P-ben van, akkor minden rá polinomiáli- san visszavezethető nyelv is P-ben van. Hasonlóan NP-re.

  41. NP-teljesség Definíció: Egy NP-beli L nyelvet NP-teljesnek nevezünk, ha minden NP-beli nyelv polinomiálisan visszavezethető L-re. Megjegyzés: Az NP-teljes nyelvek tehát a „legnehezebb” NP- beli nyelvek. Ha meg tudnánk mutatni egy NP-teljes nyelv- ről, hogy P-ben van, akkor abból következne, hogy P=NP. Észrevétel: Ha egy NP-teljes L1 nyelv polinomiálisan vissza- vezethető egy L2 nyelvre, akkor L2 is NP-teljes.

  42. Példák NP-teljes problémákra • Lefogási feladat: Adott egy véges S halmaz részhalmaza- inak egy {A1, …,Am} rendszere és egy k természetes szám. Van-e olyan legfeljebb k elemű halmaz, mely min- den Ai -t metsz? • Gráfok 3 színnel való szinezhetősége. • Diophantoszi egyenlőtlenségrendszer megoldhatósága. • Részletösszeg probléma: Adottak az a1, …,amés b termé-szetes számok. Van-e az {a1, …,am} halmaznak olyan részhalmaza, melynek összege b?

  43. Kategorizálatlan NP-beli problémák Tapasztalati tény, hogy a legtöbb NP-beli problémáról vagy az derül ki, hogy NP-teljes, vagy az, hogy P-beli. Nem sike- rült eddig besorolni az alábbiakat: • Adott természetes szám prím-e? (P?, Riemann-sejtés) • Adott n természetes számnak van-e k-nál nem nagyobb osztója? (várhatóan se nem P se nem NP-teljes) • Két adott gráf izomorf-e? (várhatóan se nem P se nem NP-teljes)

  44. Millió dolláros megoldatlan probléma A P ≠ NP sejtés az első helyen szerepel a Clay Mathematics Institute (CMI) 7 db egymillió dolláros problémája között. $1.000.000

  45. Információs bonyolultság dióhéjban Alapprobléma: eldönteni egy 0-1 sorozatról, hogy véletlen-e. Durván szólva, akkor akarunk egy sorozatot véletlennek te- kinteni, ha nincs benne „szabályosság”. Itt a szabályosságot azzal fogjuk meg, hogy az a sorozat gazdaságosabb kódolá- sára adna lehetőséget, azaz a sorozat bonyolultsága kicsi volna. Ehhez definiálnunk kell az ún. információs bonyolult- ságot.

  46. A bonyolultság definíciójának alapgondolata Egy xєΣ0*szó bonyolultságán a legrövidebb olyan szó (program) hosszát fogjuk érteni, mely egy Σ0*fölötti T univerzális Turing-gépen az x szót nyomtatja ki (azaz a programot T-n futtatva, az véges sok lépésben megáll úgy, hogy az első szalagján az x szó áll). Megjegyzés: Minden x szó kinyomtatható egy univerzális Turing-gépen. És néhány egyszerű feltevést téve a gép- re (hogy ne legyen direkt „ügyetlen” ), kiderül, hogy a bonyolultság géptől független lesz.

  47. Kommunikációs bonyolultság(bevezető példa a randomizált kommunikáció köréből) Legyen egy űrhajónk, melynek van egy 1020 bites programja. A programot néha ellenőrizni kell, mert pl. a kozmikus sugár- zás kárt tehet benne. A 1020 bit elküldése sok idő és energia. Mit érdemes csinálni?

  48. Első gondolat: Prímtényezőkre bontás. Sajnos nem nyerhetünk. 1020 bitnél olcsóbban nem úszható meg a teljes információ visszaküldése! Sőt a prímtényezőkre való bontás nehéz és a tényezőket el is kell választani. Valamiben engednünk kell! Legyen ez a biztonság. Pl. 99%-os biztonságot szeretnénk. Ha véletlenszerűen választott jegyeket küldünk vissza, akkor jegyenként csak 1/ 1020a valószínűsége annak, hogy hibás jegyre akadunk. Ezt sem érdemes!

  49. Jó módszer: Ún. randomizált algoritmus. X az űrhajó programja Y a Földön biztonságban tárolt kód p := RANDOM PRíMє]2,N[ X1 := X mod p Y1:= Y mod p • Ha X1 ≠ Y1, akkor a program rossz! • Ha X1 = Y1, akkor q valószínűséggel rossz a program, le- hetséges ugyanis, hogy p||X-Y|.

  50. q = |X-Y| prímosztóinak a száma / Π(N) := k / Π(N) /aholΠ(N) az N-nél nem nagyobb prímek száma/ Mekkora legyen N, hogy q kisebb legyen 0.01? • Legyen |X-Y| = p1β1·p2β2·… pkβk. • Legrosszabb esetben minden pi =2 és βi = 1. • Ekkor 2^(1020) ≥ |X-Y| ≥ 2k. • Tehát k ≤ 1020. • q = k / Π(N) ≤ 0.01, azaz k ≤ 0.01 Π(N). • Tehát elegendő volna, hogy 1020 ≤ 0.01 Π(N). • Vagyis 1022 ≤ Π(N).