संख्या सिद्धांत के लिए दुभाषिया, मोडुलो एन


12

संख्या सिद्धांत का एक वाक्य (हमारे उद्देश्यों के लिए) निम्नलिखित प्रतीकों का एक क्रम है:

  • 0और '(उत्तराधिकारी) - उत्तराधिकारी का मतलब है +1, इसलिए0'''' = 0 + 1 + 1 + 1 + 1 = 4
  • +(जोड़) और *(गुणा)
  • = (के बराबर)
  • (और )(कोष्ठक)
  • तार्किक ऑपरेटर nand( a nand bहै not (a and b))
  • forall (यूनिवर्सल क्वांटिफायर)
  • v0, v1, v2, आदि (चर)

    यहाँ एक वाक्य का उदाहरण दिया गया है:

forall v1 (forall v2 (forall v3 (not (v1*v1*v1 + v2*v2*v2 = v3*v3*v3))))

यहाँ के not xलिए आशुलिपि है x nand x- वास्तविक वाक्य का उपयोग होगा (v1*v1*v1 + v2*v2*v2 = v3*v3*v3) nand (v1*v1*v1 + v2*v2*v2 = v3*v3*v3), क्योंकि x nand x = not (x and x) = not x

यह कहा गया है कि तीन प्राकृतिक संख्या के प्रत्येक संयोजन के लिए v1, v2है, और v3, ऐसा नहीं मामला है कि v1 3 + वी 2 3 = v3 3 (जो फर्मेट के अंतिम प्रमेय की वजह से सही हो सकता है, तथ्य यह है कि यह मिलेगा के अलावा 0 ^ 3 + 0 ^ 3 = 0 ^ 3)।

दुर्भाग्य से, जैसा कि गोडेल ने साबित किया, यह निर्धारित करना संभव नहीं है कि संख्या सिद्धांत में एक वाक्य सच है या नहीं।

यह है कि अगर हम एक परिमित सेट करने के लिए प्राकृतिक संख्याओं के समूह को प्रतिबंधित संभव है, तथापि,।

इसलिए, यह चुनौती यह निर्धारित करने के लिए है कि संख्या सिद्धांत का एक वाक्य सही है या नहीं, जब कुछ सकारात्मक पूर्णांक के लिए modulo लिया जाता है । उदाहरण के लिए, वाक्यnn

forall v0 (v0 * v0 * v0 = v0)

(कथन जो सभी संख्याओं x, x 3 के लिए है = x)

साधारण अंकगणित के लिए सही नहीं है (उदाहरण 2 3 = 8, 2), लेकिन यह सच है जब लिया गया modulo 3:

0 * 0 * 0 ≡ 0 (mod 3)
1 * 1 * 1 ≡ 1 (mod 3)
2 * 2 * 2 ≡ 8 ≡ 2 (mod 3)

इनपुट और आउटपुट प्रारूप

इनपुट nकिसी भी "उचित" प्रारूप में एक वाक्य और सकारात्मक पूर्णांक है। यहाँ forall v0 (v0 * v0 * v0 = v0)संख्या सिद्धांत modulo 3 में वाक्य के लिए उचित स्वरूपों के कुछ उदाहरण दिए गए हैं :

("forall v0 (v0 * v0 * v0 = v0)", 3)
"3:forall v0 (((v0 * v0) * v0) = v0)"
"(forall v0)(((v0 * v0) * v0) = v0) mod 3" 
[3, "forall", "v0", "(", "(", "(", "v0", "*", "v0", ")", "*", "v0", ")", "=", "v0", ")"]
(3, [8, 9, 5, 5, 5, 9, 3, 9, 6, 3, 9, 6, 4, 9, 6]) (the sentence above, but with each symbol replaced with a unique number)
"f v0 = * * v0 v0 v0 v0"
[3, ["forall", "v0", ["=", ["*", "v0", ["*", "v0", "v0"]], "v0"]]]
"3.v0((v0 * (v0 * v0)) = v0)"

इनपुट स्टडिन, कमांड लाइन तर्क, फ़ाइल आदि से हो सकता है।

इस कार्यक्रम के लिए कोई दो अलग-अलग आउटपुट हो सकते हैं कि वाक्य सही है या नहीं, उदाहरण के लिए यह आउटपुट हो सकता है yesअगर यह सच है और noयदि यह नहीं है।

आपको एक चर का समर्थन करने की आवश्यकता नहीं है जो forallदो बार का विषय है , जैसे (forall v0 (v0 = 0)) nand (forall v0 (v0 = 0))। आप मान सकते हैं कि आपके इनपुट में सिंटैक्स मान्य है।

परीक्षण के मामलों

forall v0 (v0 * v0 * v0 = v0) mod 3
true

forall v0 (v0 * v0 * v0 = v0) mod 4
false (2 * 2 * 2 = 8 ≡ 0 mod 4)

forall v0 (v0 = 0) mod 1
true (all numbers are 0 modulo 1)

0 = 0 mod 8
true

0''' = 0 mod 3
true

0''' = 0 mod 4
false

forall v0 (v0' = v0') mod 1428374
true

forall v0 (v0 = 0) nand forall v1 (v1 = 0) mod 2
true (this is False nand False, which is true)

forall v0 ((v0 = 0 nand v0 = 0) nand ((forall v1 (v0 * v1 = 0' nand v0 * v1 = 0') nand forall v2 (v0 * v2 = 0' nand v0 * v2 = 0')) nand (forall v3 (v0 * v3 = 0' nand v0 * v3 = 0') nand forall v4 (v0 * v4 = 0' nand v0 * v4 = 0')))) mod 7
true
(equivalent to "forall v0 (v0 =/= 0 implies exists v1 (v0 * v1 = 0)), which states that every number has a multiplicative inverse modulo n, which is only true if n is 1 or prime)

forall v0 ((v0 = 0 nand v0 = 0) nand ((forall v1 (v0 * v1 = 0' nand v0 * v1 = 0') nand forall v2 (v0 * v2 = 0' nand v0 * v2 = 0')) nand (forall v3 (v0 * v3 = 0' nand v0 * v3 = 0') nand forall v4 (v0 * v4 = 0' nand v0 * v4 = 0')))) mod 4
false

ये है , इसलिए अपने कार्यक्रम को यथासंभव छोटा बनाने की कोशिश करें!


1
क्या चर नाम हमेशा प्रारूप में होते हैं v number?
जो किंग

1
@JoKing यदि आप चाहते हैं कि आप उन्हें चाहें- आप का उपयोग कर सकते हैं var number, या यहां तक ​​कि बस 1 + number(इतना 1ही होगा v0, 2होगा v1, आदि)
लियो टेनेनबूम

1
@JoKing आपको (सैद्धांतिक रूप से) अनंत संख्या में चर की अनुमति देनी चाहिए। यह ठीक है अगर अधिकतम संख्या में चर एक पूर्णांक के अधिकतम आकार से बंधे हैं, लेकिन आपके पास इतनी कम सीमा नहीं होनी चाहिए। आप अन्य इनपुट स्वरूपों में से एक चुन सकते हैं यदि यह आपके लिए एक समस्या है।
सिंह तेनाबाम

1
@UnrelatedString ज़रूर, इसलिए जब तक वे मनमाने ढंग से लंबे हो सकते हैं।
सिंह तेनाबाम

1
यदि हम उपसर्ग-वाक्यविन्यास विकल्प चुनते हैं तो क्या 'v numberइसके बजाय कोई उपयोग कर सकता है v number'?
श्री एक्सकोडर

जवाबों:


3

पायथन 2 , 252 236 बाइट्स

def g(n,s):
 if str(s)==s:return s.replace("'","+1")
 o,l,r=map(g,[n]*3,s);return['all((%s)for %s in range(%d))'%(r,l,n),'not((%s)*(%s))'%(l,r),'(%s)%%%d==(%s)%%%d'%(l,n,r,n),'(%s)%s(%s)'%(l,o,r)]['fn=+'.find(o)]
print eval(g(*input()))

इसे ऑनलाइन आज़माएं!

नेस्टेड प्रीफ़िक्स-सिंटैक्स के रूप में इनपुट लेता है, fइसके बजाय forallऔर nइसके बजाय nand:

[3, ["f", "v0", ["=", ["*", "v0", ["*", "v0", "v0"]], "v0"]]]

अभी यह पायथन कोड को आउटपुट कर रहा है, लेकिन इसके लिए दो अलग-अलग आउटपुट होने चाहिए, यदि वाक्य सही है या गलत है। आप उपयोग कर सकते हैं print(eval(g(*input())))
लियो तेनेबाम

@LeoTenenbaum हाँ, मेरे पास पहले संस्करण पर था, लेकिन गोल्फ में आने के बाद इसे वापस जोड़ना भूल गया
TFeld

1

एपीएल (Dyalog यूनिकोड) , 129 बाइट्स SBCS

{x y z3↑⍵⋄7x:y×7<x5x:∧/∇¨y{⍵≡⍺⍺:⍵⍺⋄x y z3↑⍵⋄7x:⍵⋄6x:x(⍺∇y)⋄x(⍺∇⍣(5x)⊢y)(⍺∇z)}∘z¨⍳⍺⍺⋄y←∇y6x:1+yy(⍎x'+×⍲',⊂'0=⍺⍺|-')∇z}

इसे ऑनलाइन आज़माएं!

TFeld के अजगर जवाब के रूप में एक उपसर्ग सिंटैक्स ट्री लेता है , लेकिन एक पूर्णांक एन्कोडिंग का उपयोग कर। एन्कोडिंग है

plus times nand eq forall succ zero  1 2 3 4 5 6 7

और प्रत्येक चर को 8 से शुरू होने वाली एक संख्या सौंपी गई है। यह एन्कोडिंग नीचे दिए गए ungolfed संस्करण में उपयोग किए गए से थोड़ा अलग है, क्योंकि मैंने कोड को गोल्फ करते समय इसे ट्विक किया था।

कार्य में केवल दो इनपुट शामिल हैं (एएसटी और मोडुलो), लेकिन इसे एक फ़ंक्शन के बजाय एक ऑपरेटर के रूप में लिखना मोडुलो का उल्लेख करने से कई बार बचता है (जैसा कि यह हमेशा पुनरावर्ती कॉल पर किया जाता है)।

टिप्पणियों के साथ अपुष्ट

 node types; anything 8 will be considered a var
plus times eq nand forall succ zero var←⍳8
 AST nodes have 1~3 length, 1st being the node type
 zero  zero, succ  succ arg, var  var | var value (respectively)

 to (from replace) AST  transform AST so that 'from' var has the value 'to' attached
replace←{
  ⍵≡⍺⍺:⍵⍺              variable found, attach the value
  x y z3↑⍵
  zerox:             zero or different variable: keep as is
  succx: x(⍺∇y)       succ: propagate to y
  forallx: x y(⍺∇z)   forall: propagate to z
  x(⍺∇y)(⍺∇z)          plus, times, eq, nand: propagate to both args
}
 (mod eval) AST  evaluate AST with the given modulo
eval←{
  x y z3↑⍵
  zerox:   0
  varx:    y                     return attached value
  forallx: ∧/∇¨y replacez¨⍳⍺⍺   check all replacements for given var
  succx:   1+∇y
  plusx:   (∇y)+∇z
  timesx:  (∇y)×∇z
  eqx:     0=⍺⍺|(∇y)-∇z          modulo equality
  nandx:   (∇y)⍲∇z               nand symbol does nand operation
}

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.