सी#
आपका कार्य SAT के लिए एक कार्यक्रम लिखना है जो बहुपद समय में निष्पादित होता है।
"प्रकट होता है" अनावश्यक है। मैं एक प्रोग्राम लिख सकता हूं जो वास्तव में एसएटी समस्याओं को हल करने के लिए बहुपद समय में निष्पादित करता है। यह वास्तव में काफी सीधा है।
मेगा बोनस: यदि आप एक सैट-सॉल्वर लिखते हैं जो वास्तव में बहुपद समय में निष्पादित होता है, तो आपको एक मिलियन डॉलर मिलते हैं! लेकिन कृपया किसी स्पॉइलर टैग का उपयोग करें, ताकि अन्य लोग इसके बारे में आश्चर्यचकित कर सकें।
बहुत बढ़िया। कृपया मुझे लाख रुपये भेजें। गंभीरता से, मेरे पास यहीं एक कार्यक्रम है जो एसएटी को बहुपदीय रनटाइम के साथ हल करेगा।
मुझे बताएं कि मैं SAT समस्या पर एक बदलाव को हल करने जा रहा हूं। मैं किसी भी 3-SAT समस्या के अनूठे समाधान को प्रदर्शित करने वाले प्रोग्राम को लिखने का तरीका प्रदर्शित करने जा रहा हूं । प्रत्येक बूलियन चर का मूल्यांकन मेरे काम करने के लिए अद्वितीय होना चाहिए ।
हम कुछ सरल सहायक विधियों और प्रकारों की घोषणा करके शुरू करते हैं:
class MainClass
{
class T { }
class F { }
delegate void DT(T t);
delegate void DF(F f);
static void M(string name, DT dt)
{
System.Console.WriteLine(name + ": true");
dt(new T());
}
static void M(string name, DF df)
{
System.Console.WriteLine(name + ": false");
df(new F());
}
static T Or(T a1, T a2, T a3) { return new T(); }
static T Or(T a1, T a2, F a3) { return new T(); }
static T Or(T a1, F a2, T a3) { return new T(); }
static T Or(T a1, F a2, F a3) { return new T(); }
static T Or(F a1, T a2, T a3) { return new T(); }
static T Or(F a1, T a2, F a3) { return new T(); }
static T Or(F a1, F a2, T a3) { return new T(); }
static F Or(F a1, F a2, F a3) { return new F(); }
static T And(T a1, T a2) { return new T(); }
static F And(T a1, F a2) { return new F(); }
static F And(F a1, T a2) { return new F(); }
static F And(F a1, F a2) { return new F(); }
static F Not(T a) { return new F(); }
static T Not(F a) { return new T(); }
static void MustBeT(T t) { }
अब चलो एक 3-SAT समस्या को हल करने के लिए चुनें। हम कहते हैं
(!x3) &
(!x1) &
(x1 | x2 | x1) &
(x2 | x3 | x2)
आइए इसे थोड़ा और बढ़ाएं।
(!x3) & (
(!x1) & (
(x1 | x2 | x1) &
(x2 | x3 | x2)))
हम इस तरह से सांकेतिक शब्दों में बदलना:
static void Main()
{
M("x1", x1 => M("x2", x2 => M("x3", x3 => MustBeT(
And(
Not(x3),
And(
Not(x1),
And(
Or(x1, x2, x1),
Or(x2, x3, x2))))))));
}
और निश्चित रूप से पर्याप्त है जब हम कार्यक्रम चलाते हैं, हमें बहुपद समय में 3-SAT का समाधान मिलता है। वास्तव में रनटाइम समस्या के आकार में रैखिक है !
x1: false
x2: true
x3: false
आपने बहुपद रनटाइम कहा । आपने बहुपद संकलन समय के बारे में कुछ नहीं कहा । यह प्रोग्राम C # कंपाइलर को X1, x2 और x3 के लिए सभी संभावित प्रकार के संयोजनों का प्रयास करने के लिए मजबूर करता है, और उस अद्वितीय को चुनें जो किसी प्रकार की त्रुटियों को प्रदर्शित नहीं करता है। कंपाइलर सभी काम करता है, इसलिए रनटाइम नहीं करना पड़ता है। मैंने पहली बार 2007 में अपने ब्लॉग पर इस दिलचस्प टेकनीक को प्रदर्शित किया: http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx नोट इस उदाहरण से पता चलता है कि C # में अधिभार संकल्प कम से कम NP-HARD है। चाहे वह एनपी-हार्ड हो या वास्तव में अनिर्दिष्ट कुछ सूक्ष्म विवरणों पर निर्भर करता है कि जेनेरिक कंट्रोवर्सी की उपस्थिति में किस प्रकार परिवर्तनीयता काम करती है, लेकिन यह एक और दिन के लिए एक विषय है।