ล่ามสำหรับทฤษฎีจำนวนโมดูโล n


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 + v2 3 = v3 3 (ซึ่งจะเป็นจริงเพราะทฤษฎีบทสุดท้ายของแฟร์มายกเว้นความจริงที่ว่ามันจะได้รับ 0 ^ 3 + 0 ^ 3 = 0 ^ 3)

น่าเสียดายที่Gödelพิสูจน์แล้วว่าเป็นไปไม่ได้ที่จะตัดสินว่าประโยคในทฤษฎีจำนวนนั้นเป็นจริงหรือไม่

มันคือไปได้ถ้าเรา จำกัด จำนวนของจำนวนธรรมชาติเป็นเซต จำกัด

ดังนั้นความท้าทายนี้คือการกำหนดหรือไม่เป็นประโยคของทฤษฎีจำนวนเป็นความจริงเมื่อนำมาโมดูโล สำหรับบางจำนวนเต็มบวกn nตัวอย่างเช่นประโยค

forall v0 (v0 * v0 * v0 = v0)

(ข้อความนั้นสำหรับตัวเลขทั้งหมด x, x 3 = x)

ไม่เป็นความจริงสำหรับเลขคณิตทั่วไป (เช่น 2 3 = 8 ≠ 2) แต่เป็นจริงเมื่อถ่ายโมดูโล 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)ในทฤษฎีจำนวนโมดูโล 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)"

อินพุตอาจมาจาก stdin อาร์กิวเมนต์บรรทัดคำสั่งไฟล์ ฯลฯ

โปรแกรมสามารถมีเอาต์พุตสองแบบที่แตกต่างกันไม่ว่าประโยคนั้นจะเป็นจริงหรือไม่เช่นมันสามารถแสดงผลออกมา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 พวกเขาสามารถถ้าคุณต้องการให้พวกเขา be- คุณสามารถใช้var numberหรือแม้เพียงแค่1 + number(เพื่อ1จะv0, 2จะv1ฯลฯ )
ลีโอ Tenenbaum

1
@ โจ้กกิ้งคุณควรอนุญาตให้ตัวแปรจำนวนไม่ จำกัด ไม่เป็นไรถ้าจำนวนตัวแปรสูงสุดถูก จำกัด ด้วยขนาดสูงสุดของจำนวนเต็ม แต่คุณไม่ควรมีขีด จำกัด ต่ำเช่นนี้ คุณสามารถเลือกรูปแบบอินพุตแบบใดแบบหนึ่งได้หากนี่เป็นปัญหาสำหรับคุณ
Leo Tenenbaum

1
@ ไม่เกี่ยวข้องที่แน่นอนแน่นอนตราบใดที่พวกเขาสามารถยาวโดยพลการ
Leo Tenenbaum

1
หนึ่งสามารถใช้'v numberแทนv number'ถ้าเราเลือกตัวเลือกคำนำหน้าไวยากรณ์?
Mr. Xcoder

คำตอบ:


3

Python 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"]]]

ตอนนี้มันกำลังแสดงผลโค้ด Python แต่มันควรมีเอาต์พุตที่แตกต่างกันสองแบบหากประโยคนั้นเป็นจริงหรือเท็จ print(eval(g(*input())))คุณสามารถใช้
Leo Tenenbaum

@LeoTenenbaum ใช่ฉันมีที่ในรุ่นแรก แต่ลืมที่จะเพิ่มมันกลับมาหลังจากเล่นกอล์ฟ
TFeld

1

APL (Dyalog Unicode) , 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 การเข้ารหัสนี้แตกต่างจากที่ใช้ในเวอร์ชั่นที่ไม่ได้ปรับแต่งด้านล่างเล็กน้อย

งานเกี่ยวข้องเพียงสองอินพุต (AST และโมดูโล) แต่เขียนมันเป็นโอเปอเรเตอร์แทนฟังก์ชั่นเพื่อหลีกเลี่ยงการกล่าวถึงโมดูโลหลาย ๆ ครั้ง

ไม่พอใจกับความคิดเห็น

 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
}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.