Magical Modulo Squares


11

ฉันเป็นแฟนตัวยงของทฤษฎีจำนวน สิ่งที่ยิ่งใหญ่ในทฤษฎีตัวเลขคือคณิตศาสตร์เลขคณิต ความหมายของการเป็นabmodmและถ้าหากmab สิ่งที่สนุกที่ต้องทำคือการเพิ่มพลัง: โดยเฉพาะเมื่อโมดูลัสเป็นจำนวนเฉพาะ โดยเฉพาะอย่างยิ่งจะได้รับการพิสูจน์แล้วว่าถ้าและม.มีความสำคัญ (หุ้นปัจจัยไม่มีทั่วไปนอกเหนือจาก 1 ) จากนั้นมีอยู่จำนวนอีเมลดังกล่าวที่อี1am1eae1modm .

ฉันจะอธิบายว่าการออกกำลังกายเป็นอย่างไร ลองมาโมดูลัm=7 7 ผลลัพธ์ที่เป็นไปได้ของโปรแกรมหรือฟังก์ชั่นจะเป็น:

3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1

แต่ละแถวเป็นรายการของพลังของตัวเลขแรกในแถวนั้น: แถวแรกคือ3,32,33,,36ซึ่งเทียบเท่ากับ3,2,6,4,5,1 modulo 7 . แถวที่สองของตารางดังกล่าวเป็นอำนาจของ2 , etcetera ถึงแถวสุดท้ายซึ่งเป็นเพียงอำนาจของ11

นี่คือจัตุรัสแบบโมดูโลที่มีมนต์ขลังเพราะ:

  • สี่เหลี่ยมจัตุรัสนั้นสมมาตร นั่นคือคอลัมน์i th เหมือนกับแถวi th
  • ค่าทั้งหมด1ถึงm1ปรากฏอย่างน้อยหนึ่งครั้ง

ด้านล่างเป็นผลลัพธ์ที่ใช้ได้เพียงอย่างเดียวสำหรับm=7เริ่มต้นด้วยกำลังของ5 :

5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1

ความท้าทาย

สร้างฟังก์ชั่นหรือโปรแกรมที่ให้pเอาต์พุตที่สำคัญกับจตุรัสเวทย์มนตร์โมดูโลนั่นคือสแควร์ที่มีความยาวด้านp-1โดยแต่ละแถวนั้นเป็นรายการของอำนาจต่อเนื่องขององค์ประกอบแรกในแถวและเหมือนกันสำหรับคอลัมน์ ตัวเลขทั้งหมดระหว่าง0และpต้องเกิดขึ้นและสแควร์สามารถมีตัวเลขในช่วงนั้นเท่านั้น

อินพุตเป็นตัวเลขหรือสตริงและเอาต์พุตสามารถเป็น ascii เมทริกซ์อาร์เรย์ของอาร์เรย์ (รูปแบบที่เหมาะสม)

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ


ลำดับ OEIS ที่เกี่ยวข้อง: A001918 (ค่าที่ถูกต้องต่ำสุดสำหรับมุมซ้ายบน)
Arnauld

2
" ฉันจะอธิบายว่าแบบฝึกหัดนั้นเป็นตัวอย่างอะไร " ไม่ อธิบายด้วยเงื่อนไขของตัวเองแล้วยกตัวอย่างเพื่ออธิบาย ผมคิดว่าสิ่งที่คุณกำลังขอเป็นเมทริกซ์ดังกล่าวว่า1 , 1เป็นรากดั้งเดิมแบบโมดูโลพีและฉัน, J = 1 , 1AA1,1pแต่มันเป็นความพยายามอย่างมากที่จะดึงสเปคจากคำถามที่ว่ามันยืน Ai,j=A1,1ijmodp
Peter Taylor

2
@PeterTaylor จริงและนั่นคือสิ่งที่ฉันหมายถึง แต่อย่างแรกที่ทำลายส่วนหนึ่งของความสนุกในการสำรวจและประการที่สองมันขึ้นอยู่กับความรู้เกี่ยวกับรากดั้งเดิมและคณิตศาสตร์แบบแยกส่วน ฉันต้องการให้คำถามนี้ตอบได้โดยผู้ชมที่กว้างกว่านั้นดังนั้นฉันจึงพยายามอธิบายสิ่งที่ฉันหมายถึงในแง่ที่ง่ายขึ้น
vrugtehagel

คำตอบ:


5

เยลลี่ , 13 10 ไบต์

-3 ขอบคุณ Nick Kennedy

รู้สึกเหมือนรหัสซ้ำควรจะเป็นกอล์ฟสามารถ แต่ฉันได้ไม่ได้จัดการวันที่มัน ...

*€Ṗ%µQƑƇḢị

ลองออนไลน์! (ส่วนท้ายรูปแบบสวยเป็นตาราง)

อย่างไร?

*€Ṗ%µQƑƇḢị - Link: integer, p
 €         - for each n in [1..p]
*          -   exponentiate with:
  Ṗ        -     pop = [1..p-1]
           - ...i.e [[1^1,1^2,...,1^(p-1)],[2^1,2^2,...,2^(p-1)],...,[....,p^(p-1)]]
   %       - modulo p
    µ      - start a new monadic chain (call that list of lists X)
       Ƈ   - keep those which:
      Ƒ    -   are invariant under:
     Q     -     de-duplicate
        Ḣ  - head
         ị - index into the list of lists X


Ahha ตอนนี้ฉันรู้สึกช้า p ขอบคุณ!
Jonathan Allan

3

ถ่าน , 36 ไบต์

≔E…¹θ﹪Xι…¹θIθηE⊟Φη⁼¹№ι¹⪫E§η⊖ι◧IλL⊖θ 

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด หมายเหตุ: พื้นที่ต่อท้าย คำอธิบาย:

≔E…¹θ﹪Xι…¹θIθη

สร้างอาร์เรย์p-1ตามp-1กำลังของ1..p-1ถึงดัชนี1..p-1(โมดูโลp)

E⊟Φη⁼¹№ι¹

1แผนที่กว่าหนึ่งแถวซึ่งมีตรงหนึ่ง

⪫E§η⊖ι◧IλL⊖θ 

จัดเรียงแถวใหม่ตามลำดับที่กำหนดโดยแถวที่เลือกและจัดรูปแบบเอาต์พุต




2

JavaScript (ES7),  91  86 ไบต์

p11

f=(p,k)=>(g=k=>[...Array(i=p-1)].map(_=>k**++i%p))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

ลองออนไลน์!


JavaScript (ES6),  92  87 ไบต์

รุ่นนี้ใช้การยกกำลังแบบแยกส่วนเพื่อสนับสนุนค่าอินพุตที่สูงขึ้น (มาก)

f=(p,k)=>(g=k=>[...Array(p-1)].map(_=>n=n*k%p,n=1))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

ลองออนไลน์!

อย่างไร?

ค้นหาแถวแรก

1k<pgak(n)=knmodp1n<p

g = k =>              // k = input
  [...Array(p - 1)]   // generate an array of size p - 1
  .map(_ =>           // for each entry in there:
    n = n * k % p,    //   update n to (n * k) mod p
    n = 1             //   starting with n = 1
  )                   // end of map()

knak(n)=11

g(k).sort()[1] > 1

สิ่งนี้ทำงานได้แม้จะอยู่ในลำดับพจนานุกรมซึ่งเป็นพฤติกรรมเริ่มต้นของsort()- เพราะ:

  • 1
  • 11

ตัวอย่าง:

p=17

  • k=1
    • a1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    • [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  • k=2
    • a2=[2,4,8,16,15,13,9,1,2,4,8,16,15,13,9,1]
    • [1,1,13,13,15,15,16,16,2,2,4,4,8,8,9,9]
  • k=3
    • a3=[3,9,10,13,5,15,11,16,14,8,7,4,12,2,6,1]
    • [1,10,11,12,13,14,15,16,2,3,4,5,6,7,8,9]

อาคารเมทริกซ์

kg(k)gg(k)

ส่วนนี้สามารถเขียนได้ง่าย ๆ เป็น:

g(k).map(g)

.indexOf(1)>p-3บันทึก 3 .everyไบต์มากกว่า
Neil

@ Neil ขอบคุณ แต่ฉันได้พบวิธีที่สั้นกว่าหลังจากนอนหลับฝันดี :)
Arnauld

2

Zsh , 117 90 ไบต์

b=$1
c=(eval set -- '$[x**'{1..$[b-1]}%b\])
for ((;${#${(u)@}}-b+1;++x))$c
for x;$c&&<<<$@

ลองออนไลน์! ลองออนไลน์!

ขอพระเจ้าทรงเมตตาจิตวิญญาณของฉัน มีการปฏิบัติที่เลวร้ายมากมายห่อไว้ที่นี่ให้ฉันอธิบายผู้กระทำผิดที่ใหญ่ที่สุดอย่างน้อย:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
                      {1..$[b-1]}        # brace expansion, expands immediately
               '$[x**'           %b\]    # string literals, expand during eval
   eval set --                           # sets the positional parameters
c=(                                   )  # defines c to the words contained

ตัวอย่างสำหรับb=4:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
c=(eval set -- '$[x**'{1..3}%b\]     )                # $[b-1] => 3
c=(eval set -- '$[x**1%b]' '$[x**2%b]' '$[x**3%b]' )  # brace expansion

สุดท้ายที่ปรากฏในส่วนที่เหลือของโปรแกรมองค์ประกอบมากมายที่มีการประเมินว่า$ceval set -- ....

สุดท้าย${#${(u)@}}นับองค์ประกอบที่เป็นเอกลักษณ์ของพารามิเตอร์ตำแหน่ง (เช่น: มีรอบ / มี1s)

ความคิดเห็นที่เกี่ยวข้องกับ 117 คำตอบด้านล่าง


ความท้าทายที่เราต้องเอาชนะ:

  • ไม่มีอาร์เรย์หลายมิติหรือซ้อนกัน แต่เราจะพิมพ์สตริงออกมาเมื่อเราวนมันกลับมา
  • ตัวเลือกสำหรับการทดสอบว่าแถวที่กำหนดมีหลาย 1s หรือไม่:
    • ${#${(M)a:#1}: :#ลบการจับคู่และ(M)สลับการจับคู่ ดังนั้นสิ่งนี้จะขยายเป็นจำนวน ( ${# }) ของ1s ในอาร์เรย์ น่าเสียดายที่การขยายตัวนี้ไม่ได้เล่นอย่างดีกับคณิตศาสตร์สำหรับวงที่เราใช้ที่นี่ ถ้าเป็นเช่นนั้นก็อาจบันทึกไบต์ได้
    • ${${:-1}:*a}: นี่คือจุดตัดระหว่างชุดเดี่ยวและชุด1 aสิ่งนี้จะขยายไปที่เดียว1ถ้าพบในอาเรย์ เมื่อใช้ตัวเลือกนี้เราจะบันทึกอักขระหนึ่งตัวที่นี่ แต่เสีย 1 โดยรวมโดยไม่ต้องเลื่อนการเพิ่ม1s ลงในแถวและคอลัมน์สุดท้ายจนกระทั่งสิ้นสุด
f(){ # f [element] [modular base], puts powers up to n-2 into array $a
    a=()
    for i ({1..$[$2-2]})
        a+=($[$1**i%$2])
}
a=(1)                     # put 1 in a to force first loop iteration
for ((;${${:-1}:*a};))    # test for 1 in array $a
    f $[++x] $1           # increment x, iterate through all elements mod $1
for y ($a 1){             # for all elements in the [last array, 1]
    f $y $1               # put that row in $a
    <<<$a\ 1              # print out $a with 1 appended (space-delimited string)
}

1

Perl 6 , 65 57 ไบต์

{.[|.first(*.Set+2>$_)]}o{.&{@=(($++X**1..^$_)X%$_)xx$_}}

ลองออนไลน์!

อาจจะมีวิธีที่จะเพียงแค่ส่งออกสแควร์ตัวเอง แต่นี่เป็นกระบวนการเดียวกันที่ระบุไว้ในคำถามเรียงลำดับรายการตามตำแหน่งของพวกเขาในรายการแรกที่เป็นเพียงการเปลี่ยนแปลง 1 ถึง input-1 ส่งคืนเป็นรายการของรายการ

BTW มีจ๊อกกิ้งมากมายพยายามที่จะหลีกเลี่ยงข้อ จำกัด ที่น่ารำคาญของ Perl 6 ที่เกี่ยวข้องกับซีเควนซ์ vs อาร์เรย์และตัวแปรที่ไม่ระบุตัวตน

คำอธิบาย:

                               $++               xx$_    # Map 0 to i-1 to
                              (   X**1..^$_)             # n, n^2, n^3... n^(i-1)
                             (              X%$_)        # All modulo i
{                      }o{.&{                        }}  # Pass to the next function
 .[                   ]    # Index into that list of lists
   |.first(          )     # The list of the first list that
           *.Set+2>$_        # Has all the elements in the range 1 to i-1


1

05AB1E , 19 16 ไบต์

LεI<LmI%}ÐΘOÏн<è

-3 ไบต์ขอบคุณที่@Emigna

ลองใช้ออนไลน์ (ส่วนท้ายคือการพิมพ์รายการ 2D)

คำอธิบาย:

L          # Create a list in the range [1, (implicit) input]
 ε         # Map each number `y` in the list to:
  I<L      #  Create a list in the range [1, input-1]
     m     #  Get number `y` to the power of each number in this list
      I%   #  Take modulo-input on each number
         # After the map: triplicate this modified matrix
   ΘO      # Get the amount of 1s in each row
     Ï     # And only leave the rows with exactly one 1
      н    # Then only leave the first row which contains a single 1
       <   # Decrease each value by 1 to make it 0-indexed
        è  # And index each into the rows of the modified matrix to create a new matrix
           # (which is output implicitly as result)

1
LεI<LmI%}ÐΘOÏн<èสำหรับ 16 ไบต์
Emigna

@ Emigna ขอบคุณ! ไม่ได้ตระหนักถึงจะเพียงพอแล้วแทนที่จะเป็นUΣXykฉัน
Kevin Cruijssen



0

APL (NARS), 29 ตัวอักษร, 58 ไบต์

{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}

ทดสอบ:

  f←{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}
  3 f 7
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
  5 f 7
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.