Anlaşılması gereken ilk şey, P ve NP'nin sorunları değil, dilleri sınıflandırmasıdır . Bunun ne anlama geldiğini anlamak için önce başka tanımlara ihtiyacımız var.
Bir alfabe boş olmayan sonlu bir semboller kümesidir.
{ 0
, 1
} ASCII karakter kümesi gibi bir alfabedir. {} bir alfabe değil çünkü boş. N (tamsayılar) bir alfabe değildir, çünkü sonlu değildir.
Let Σ bir alfabe olacak. Dan sembollerin sonlu sayıda sıralı bir birleştirme Σ bir denir sözcüğü üzerinde Σ .
Dize 101
, { 0
, 1
} alfabesinin üzerinde bir kelimedir . Boş kelime (genellikle yazılı £ değerinin ) Herhangi alfabenin üzerinde bir kelimedir. Dize penguin
, ASCII karakterlerini içeren alfabenin üzerinde bir kelimedir. Numara tt ondalık notasyonu alfabesi üzerinde bir kelime değildir { .
, 0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
} o sonlu olmadığı için.
Uzunluk , bir sözcüğün w , yazılı olarak | w |, içindeki sembol sayısıdır.
Örneğin, | hello
| = 5 ve | ε | = 0 Herhangi bir kelime için w , | w | ∈ N ve bu nedenle sonlu.
Let Σ bir alfabe olacak. Set Σ * üzerindeki tüm kelimeleri içeren Σ dahil £ değerinin . Set Σ + üzerindeki tüm kelimeleri içeren Σ hariç £ değerinin . İçin n ∈ N , Σ N uzunluğu kelime grubu olan n .
Her alfabe için Σ , Σ * ve Σ + sonsuz sayı kümeleridir . ASCII karakter kümesi için Σ ASCII , düzenli ifadeler .*
ve .+
göstermektedirler Σ ASCII * ve Σ ASCII + sırasıyla.
{ 0
, 1
} 7 7 bitlik ASCII kodları kümesidir { 0000000
, 0000001
, ..., 1111111
}. { 0
, 1
} 32 , 32 bit tam sayı değer kümesidir.
Let Σ bir alfabe ve olmayacak L ⊆ Σ * . L bir denir dili üzerinde Σ .
Bir alfabe için Σ boş seti ve Σ * üzerinde önemsiz dillerdir Σ . Eski sık sık boş dil olarak adlandırılır . Boş dil {} ve sadece boş kelime { ε } içeren dil farklıdır.
NaN olmayan IEEE 754 kayan nokta değerlerine karşılık gelen { 0
, 1
} 32 alt kümesi sonlu bir dildir.
Dillerin sonsuz sayıda kelimesi olabilir, ancak her dilde sayılabilir. Dizeleri seti { 1
, 2
, ...} onluk sistemde tamsayılar belirten alfabenin üzerinde sonsuz bir dildir { 0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
}. Dizeleri sonsuz kümesi { 2
, 3
, 5
, 7
, 11
, 13
, ...} onluk sistemde asal sayılar belirten bunların uygun bir alt kümesidir. Düzenli ifadeyle eşleşen tüm kelimeleri içeren [+-]?\d+\.\d*([eE][+-]?\d+)?
dil, ASCII karakter kümesi üzerindeki bir dildir (C programlama dili tarafından tanımlanan geçerli kayan nokta ifadelerinin bir alt kümesini ifade eder).
Tüm gerçek sayıları içeren herhangi bir dil yoktur (herhangi bir notasyonda) çünkü gerçek sayılar kümesi sayılabilir değildir.
Let Σ bir alfabe ve olmayacak L ⊆ Σ * . Bir makine D karar L , her bir giriş için, eğer ağırlık ∈ Σ * Bu hesaplar karakteristik fonksiyon χ L ( w sonlu zaman). Karakteristik fonksiyon olarak tanımlanır
χ L : Σ * → {0, 1}
w ↦ 1, w ∈ L
0, aksi takdirde.
Böyle bir makine L için bir karar verici denir . “Verilen w , D çıkışı x ” için “ D ( w ) = x ” yazıyoruz .
Çok sayıda makine modeli var. Günümüzde pratik kullanımda en yaygın olanı bir Turing makinesinin modelidir . Bir Turing makinesinin hücrelere kümelenmiş sınırsız lineer depolaması vardır. Her hücre, herhangi bir zamanda tam olarak bir alfabenin bir sembolünü tutabilir. Turing makinesi, bir hesaplama adım dizisi olarak hesaplamasını gerçekleştirir. Her adımda, bir hücresini okuyabilir, muhtemelen değerinin üzerine yazabilir ve okuma / yazma kafasını bir konum sola veya sağ hücreye taşıyabilir. Makinenin gerçekleştireceği eylem sonlu durumlu bir otomat tarafından kontrol edilir.
Sınırlı sayıda talimat ve sınırsız saklama özelliğine sahip rastgele erişimli bir makine, Turing makine modeli kadar güçlü olan başka bir makine modelidir.
Bu tartışma uğruna, kullandığımız kesin makine modeliyle bizi rahatsız etmeyeceğiz, ancak makinenin sınırlı bir deterministik kontrol ünitesine, sınırsız depolamaya sahip olduğunu ve sayılabilecek adımların bir sırası olarak bir hesaplama yaptığını söylemek yeterli olacaktır.
Sorunuzda kullandığınızdan beri, “büyük-O” yazımına aşina olduğunuzu farz ediyorum, bu yüzden burada sadece hızlı bir tazeleme.
Let f : N bir işlevi →. Grubu O ( f ) tüm fonksiyonlar içeren g : N → N sabitleri orada mevcut olan N 0 ∈ N ve c ∈ N gibi, her söz konusu n ∈ N ile n > n, 0 doğru olduğunu g ( n ) ≤ C f ( n )
Şimdi asıl soruya yaklaşmaya hazırız.
Sınıf P her dil içeren L Turing makinesi mevcut olduğu D karar L ve sabit k ∈ N Her giriş için bu şekilde ağırlık , D durur sonra en fazla T (| W bir işlev için adımlar |) T ∈ O ( n ↦ n k ).
Yana O ( n ↦ n k ), matematiksel olarak doğru iken, yazma için sakıncalı ve okumak, çoğu insan olduğunu - dürüst olmak gerekirse, herkesin kendim dışında - genellikle basitçe yazıyor Ç ( n k ).
Sınırın w uzunluğuna bağlı olduğunu unutmayın . Bu nedenle, asalların dili için yaptığınız argüman sadece unaray kodlamalarındaki sayılar için geçerlidir , burada n sayısının w kodlaması için, kodlamanın uzunluğu | w | n ile orantılıdır . Hiç kimse böyle bir kodlamayı pratikte kullanmaz. Ancak, tüm olası faktörleri denemekten daha gelişmiş bir algoritma kullanarak, eğer girdiler ikili (veya başka bir bazda) kodlanmışsa , asal sayıların dilinin P'de kaldığı gösterilebilir . ( Yoğun ilgiye rağmen, bu yalnızca Manindra Agrawal, Neeraj Kayal ve Nitin Saxena tarafından ispatlanabildi. 2004 yılında ödüllü bir makalede algoritmanın çok basit olmadığını tahmin edebilirsiniz.)
Önemsiz diller {} ve Σ * ve önemsiz olmayan dil { ε } Açıkçası olan P (herhangi bir alfabe için Σ ). En sevdiğiniz programlama dilinde, bir diziyi girdi olarak alan ve dizgenin, her biri için dilden bir kelime olup olmadığını belirten ve işlevinizin polinom çalışma zamanı karmaşıklığı olduğunu söyleyen bir boolean döndüren işlevler yazabilir misiniz?
Her normal dil (normal ifade ile tanımlanan dil) P cinsindendir .
Let Σ bir alfabe ve olmayacak L ⊆ Σ * . Bir makine V iki kelime kodlanmış bir demet alır w , c ∈ Σ * adımları sınırlı bir sayıda sonra çıkışlar, 0 ya da 1 olduğu doğrulayıcı için L , aşağıdaki özelliklere sahip olduğu takdirde.
- Verilen ( w , c ), V , yalnızca w ∈ L ise 1 değerini verir .
- Her için ağırlık ∈ L , bir vardır C ∈ Σ * bu şekilde V ( a , c ) 1 =.
C yukarıdaki tanımında adı şahit (veya sertifika ).
Bir doğrulayıcı bile yanlış tanık için yanlış negatif vermek için izin w aslında içindedir L . Bununla birlikte, yanlış pozitifler vermek yasaktır. Ayrıca, dildeki her bir kelime için, en az bir tanık bulunması gerekmektedir.
Asıl olmayan tüm tam sayıların ondalık kodlarını içeren KOMPOZİT dili için tanık bir çarpanlaştırma olabilir. Örneğin, ∈ KOMPOZİT (659, 709)
için tanıktır 467231
. Tanık olmadan, bir kağıdın üzerinde, 467231'in asal olmadığını kanıtlamanın, bilgisayar kullanmadan zor olacağını kolayca doğrulayabilirsiniz.
Uygun bir tanığın nasıl bulunabileceği hakkında hiçbir şey söylemedik. Bu deterministik olmayan kısımdır.
Sınıf NP her dil içeren L Turing makinesi mevcut olduğu V doğrular L ve sabit k ∈ N Her giriş için öyle ki ( a , c ), V durur sonra en fazla T (| a |) bir fonksiyon için adımlar T ∈ O ( n, ↦ n k ).
Not Yukarıdaki tanım her biri için bu ima ağırlık ∈ L bir tanık vardır c ile | c | ≤ T (| w |). (Turing makinesi muhtemelen tanığın daha fazla sembolüne bakamaz.)
NP , P'nin bir üst kümesidir (neden?). NP dilinde olan dillerin olup olmadığı bilinmemektedir, ancak P dilinde değildir .
Tamsayılı çarpanlara ayırma kendi başına bir dil değildir. Bununla birlikte, kendisiyle ilişkili karar sorununu temsil eden bir dil oluşturabiliriz . Kendisine, bir bütün dizilerini içeren dil ( n , m, öyle ki) n, bir faktör vardır d ile D ≤ m . Bu dile FACTOR diyelim. FACTOR'a karar verecek bir algoritmanız varsa, her asal çarpan için yinelemeli bir ikili arama yaparak sadece polinom yükü ile tam bir çarpanlaştırmayı hesaplamak için kullanılabilir.
FACTOR'un NP cinsinden olduğunu göstermek kolaydır . Uygun bir tanık basitçe d faktörü olacaktır ve tüm doğrulayıcının yapması gereken d ≤ m ve n mod d = 0 olduğunu doğrulamaktır. Tüm bunlar polinom sürede yapılabilir. (O yine, Ol kodlama uzunluğu sayısı fazla olduğu ve logaritmik olarak n .)
FACTOR'un P de olduğunu gösterebilirseniz, birçok harika ödül aldığınızdan emin olabilirsiniz. (Ve bugünün şifrelemesinin önemli bir bölümünü kırdınız.)
Her dil için NP , bir kaba kuvvet algoritması vardır karar deterministik onu. Sadece tüm tanıklar üzerinde kapsamlı bir araştırma yapar. (Bir tanığın azami uzunluğunun bir polinom tarafından sınırlandırıldığına dikkat edin.) Bu nedenle, PRIMES'e karar verme algoritmanız aslında KOMPOZİT'e karar vermek için kaba kuvvet algoritmasıydı.
Son sorunuzu ele almak için, azaltma yapmamız gerekiyor . İndirimler çok güçlü bir teorik bilgisayar bilimi kavramıdır. Bir problemi bir başkasına düşürmek temel olarak bir problemi başka bir problemi çözerek çözmek demektir.
Let Σ bir alfabe olması ve A ve B üzerinde dil olmak Σ . Bir olan polinom zamanlı birçok kimse indirgenebilir için B bir işlev mevcutsa f : Σ * → Σ * aşağıdaki özelliklere sahip.
- w ∈ bir ⇔ f ( a ∈) B için tüm ağırlık ∈ Σ * .
- Fonksiyon f Her giriş için Turing makine ile hesaplanabilmektedir ağırlık polinom in sınırlanmış adımların bir dizi | w |.
Bu durumda, biz yazmak A ≤ p B .
Örneğin, A , bir üçgen içeren tüm grafikleri (bitişiklik matrisi olarak kodlanmış) içeren dil olsun . (Üçgen, uzunluğu 3 olan bir döngüdür.) Sıfır olmayan izli tüm matrisleri içeren dil B olsun . (Bir matrisin izi, ana diyagonal öğelerin toplamıdır.) O zaman, A , B'ye indirgenebilen çok-zamanlı bir çok-zamanlıdır . Bunu kanıtlamak için uygun bir dönüşüm fonksiyonu bulmamız gerekir f . Bu durumda, bitişik matrisin 3. gücünü hesaplamak için f değerini ayarlayabiliriz . Bu, her biri polinom karmaşıklığına sahip iki matris-matris ürünü gerektirir.
L ≤ p L olduğu çok doğru . (Resmen kanıtlayabilir misiniz?)
Bunu şimdi NP'ye uygulayacağız .
Bir dil L olan NP -Zor ancak ve ancak L '≤ p L her dil için L ' ∈ NP .
Bir NP -Hard dil veya olmayabilir olabilir NP kendisi.
Bir dil L olan NP -tamamlamak ancak ve ancak
- L ∈ NP ve
- L , NP- serttir.
NP'nin en meşhur dili SAT'dır. Memnun olabilen tüm boolean formülleri içerir. Örneğin, ( a ∨ b ) ∧ (¬ a ∨ ¬ b ) ∈ SAT. Geçerli bir tanık { a = 1, b = 0}. ( A ∨ b ) ∧ (¬ a ∨ b ) ∧ ¬ b ∉ SAT formülü. (Bunu nasıl ispat edersin?)
SAT ∈ NP olduğunu göstermek zor değil . SAT'ın NP- sertliğini göstermek biraz işe yarar, ancak 1971'de Stephen Cook tarafından yapılmıştır .
Bir NP- tamamlayıcı dili bir kez bilindiğinde, diğer dillerin NP- bütünlüğünü azaltma yoluyla göstermek nispeten basitti . Dil Eğer bir olduğu bilinmektedir NP o gösteren -Sert A ≤ s B olduğu Şekil B olan NP ( “≤ geçişliliğinden ile de -Sert p ”). 1972'de Richard Karp , NP olduğunu gösterebileceği 21 dilden oluşan bir liste yayınladı.-SAT (geçişli) azaltma yoluyla tamamlandı. (Bu cevabın gerçekte okumanızı tavsiye ettiğim tek yazı bu. Diğerlerinden farklı olarak, anlaşılması zor değil ve NP'nin eksiksizliğini azaltma yoluyla nasıl çalıştığını kanıtlamak konusunda çok iyi bir fikir veriyor .)
Son olarak, kısa bir özet. Biz semboller kullanacağız NPH ve NPC sınıflarını göstermek için NP -Zor ve NP sırasıyla -tamamlamak dilleri.
- P ⊆ NP
- NPC ⊂ NP ve NPC ⊂ NPH , aslında NPC = NP ∩ NPH tanım gereği
- ( A ∈ NP ) ∧ ( B ∈ NPH ) ⇒ A ≤ p B
NPC ⊂ NP dahil edilmesinin P = NP olması durumunda bile uygun olduğuna dikkat edin . Bunu görmek için, kendinizi hiç olmayan önemsiz bir dil önemsiz bir birine düşürülmüş ve önemsiz de dil vardır edilebileceğini temizlemek yapmak P hem de önemsiz olmayan diller NP . Bu (çok ilginç değil) bir köşe durum olsa.
ek
Karışıklık Birincil kaynak siz “düşünüyorduk o gibi görünüyor n ” nde “ O ( n ↦ f ( n ))” olarak yorumlanması aslında referans veren bir algoritmanın girdi uzunluğunun girişinin. Bu önemli bir ayrımdır, çünkü bir algoritmanın asimptotik karmaşıklığının girdi için kullanılan kodlamaya bağlı olduğu anlamına gelir .
Bu hafta, bilinen en büyük Mersenne üssü için yeni bir rekor elde edildi. Şu anda bilinen en büyük asal sayı 2 74 207 281 - 1'dir. Bu sayı o kadar büyük ki başımı ağrıtıyor , bu yüzden aşağıdaki örnekte daha küçük bir tane kullanacağım: 2 31 - 1 = 2 147 483 647. farklı şekillerde kodlanmalıdır.
- Mersenne üssüne göre ondalık sayı:
31
(2 bayt)
- ondalık sayı olarak:
2147483647
(10 bayt)
- : tekli sayı olarak 2 147 483 640 daha fazlası ile değiştirilecek olan s (yaklaşık 2 GiB)
11111…11
…
1
Tüm bu dizgiler aynı sayıyı kodlar ve bunlardan herhangi birini verdiğimizde, aynı sayının başka bir kodlamasını kolayca yapabiliriz. (Ondalık kodlamayı, isterseniz ikili, sekizli veya onaltılı ile değiştirebilirsiniz. Uzunluğu yalnızca sabit bir faktörle değiştirir.)
İlkelliği test etmek için naif algoritma sadece unary kodlamalar için yalnızca polinomdur. AKS asallık Test onlu (ya da herhangi bir diğer baz için polinom b ≥ 2). Lucas-Lehmer asallık testi Mersenne için bilinen en iyi algoritma asal olan M p ile p tek bir asal ama yine de Mersenne üs ikili kodlama uzunluğu üstel p (polinom p ).
Bir algoritmanın karmaşıklığı hakkında konuşmak istiyorsak, hangi gösterimi kullandığımızın çok açık olması çok önemlidir. Genel olarak, en verimli kodlamanın kullanıldığı varsayılabilir. Yani, tamsayılar için ikili. (Her asal sayının bir Mersenne astarı olmadığını, bu nedenle Mersenne üssünü kullanmak genel bir kodlama şeması olmadığını unutmayın.)
Teorik şifrelemede, birçok algoritmalar resmen tamamen yararsız dize geçirilen k 1
ilk parametre olarak s. Algoritma asla bu parametre bakar ama buna resmen de polinom olmasını sağlar k olan, güvenlik parametresi ayarlamak için prosedürün güvenliğini kullandı.
İkili kodlamadaki karar dilinin NP- tam olduğu bazı problemlerde , gömülü sayıların kodlanması birliğe çevrilirse, karar dili artık NP- tam değildir . Diğer sorunlara ilişkin karar dilleri o zaman bile NP olarak tamamlanmış durumda . Sonuncusuna şiddetle NP- tamamlayıcı denir . En iyi bilinen örnek çöp kutusu ambalajıdır .
Girdi sıkıştırılmışsa bir algoritmanın karmaşıklığının nasıl değiştiğini görmek de ilginçtir (ve belki de daha fazlası) . Mersenne primerleri örneği için, her biri öncekinden daha logaritmik olarak sıkıştırılmış üç kodlama gördük.
1983 yılında, Hana Galperin ve Avi Wigderson , grafiğin giriş kodlaması logaritmik olarak sıkıştırıldığında, genel grafik algoritmalarının karmaşıklığı hakkında ilginç bir makale yazdılar . Bu girdiler için yukarıdan bir üçgen içeren grafiklerin dili (açıkça P'de olduğu yer ) aniden NP- tamamlayıcı hale gelir .
Bunun nedeni P ve NP gibi dil sınıflarının problemler için değil diller için tanımlanmış olmasıdır .