ประเมินเสาพลังงานแบบแยกส่วน


13

ให้สองตัวเลข n และ m, ประเมินหอพลังอนันต์:

n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m

โปรดทราบว่า ^ มีความสัมพันธ์ที่ถูกต้อง ดังนั้น 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4) ทีนี้คุณจะสามารถกำหนดค่าให้กับตัวดำเนินการเชื่อมโยงแบบไม่สิ้นสุดได้อย่างไร

กำหนด f (n, m, i) เป็นหอส่งกำลังไฟฟ้าที่บรรจุเทอมแรกของหอส่งกำลังไม่มีที่สิ้นสุด จากนั้นก็มีค่าคงที่ C เช่นนี้สำหรับทุก ๆ i> C, f (n, m, i) = f (n, m, C) ดังนั้นคุณสามารถพูดได้ว่าหอพลังงานที่ไม่มีที่สิ้นสุดมาบรรจบกับค่าที่แน่นอน เราสนใจในคุณค่านั้น


โปรแกรมของคุณจะต้องสามารถคำนวณ n = 2017, m = 10 ^ 10 ได้ภายใน 10 วินาทีบนพีซีที่ทันสมัยพอสมควร นั่นคือคุณควรใช้อัลกอริธึมที่แท้จริงโดยไม่มีข้อผิดพลาด

คุณอาจจะคิดว่าn <2 30และม. <2 50สำหรับข้อ จำกัด ของตัวเลขในการเขียนโปรแกรมภาษาของคุณ แต่ขั้นตอนวิธีการของคุณจะต้องทำงานในทางทฤษฎีสำหรับขนาดใดก็ได้n , ม. อย่างไรก็ตามโปรแกรมของคุณจะต้องถูกต้องสำหรับอินพุตภายในข้อ จำกัด ด้านขนาดค่าโอเวอร์โฟลว์ค่ากลางจะไม่ได้รับการยกเว้นหากอินพุตอยู่ภายในขีด จำกัด เหล่านี้

ตัวอย่าง:

2, 10^15
566088170340352

4, 3^20
4

32, 524287
16

เคล็ดลับ (สำหรับลุ้น) nและmจะไม่ได้รับประกันว่าจะร่วมที่สำคัญ
Leun Nun

1
10 ^ 10 (และ 10 ^ 20 และอาจเป็น 3 ^ 20 สำหรับจำนวนเต็มที่ลงนาม) มีขนาดใหญ่กว่าประเภทจำนวนเต็มเริ่มต้นของหลายภาษา จำเป็นหรือไม่ที่ต้องรองรับอินพุตขนาดใหญ่นี้?
Doorknob

1
@ หรือไม่นั่น "ใช่" รวม 10 ^ 20 หรือไม่ เพราะนั่นไม่พอดีกับจำนวนเต็ม 64- บิตดังนั้นหากคุณต้องการมันฉันขอแนะนำให้ชี้ให้เห็นอย่างชัดเจนเพราะมิฉะนั้นคุณจะได้รับคำตอบที่ไม่ถูกต้องมาก ๆ จากผู้คนเพียงแค่สมมติว่า 64 บิต จำนวนเต็มจะแม่นยำพอ
Martin Ender

1
ทั้งสองวิธีสิ่งที่เป็นอินพุทที่ใหญ่ที่สุดที่เราต้องการที่จะสนับสนุน?
Martin Ender

@Doorknob ฉันเพิ่มขีด จำกัด ผ่อนปรนมากขึ้นในการท้าทาย อย่างไรก็ตามขั้นตอนวิธีการของคุณในทางทฤษฎีจะต้องทำงานสำหรับทุกขนาดm, n
orlp

คำตอบ:


7

Pyth, 23 ไบต์

M&tG.^HsgBu-G/GH{PGGhHG

กำหนดฟังก์ชั่นgโดยใช้mและnตามลำดับ

ลองออนไลน์

มันทำงานอย่างไร

M&tG.^HsgBu-G/GH{PGGhHG
M                         def g(G, H):
 &tG                        0 if G == 1, else …
                 PG         prime factors of G
                {           deduplicate that
          u-G/GH   G        reduce that on lambda G,H:G-G/H, starting at G
                              (this gives the Euler totient φ(G))
        gB          hH      bifurcate: two-element list [that, g(that, H + 1)]
       s                    sum
    .^H               G     H^that mod G

Python 2, 109 76 ไบต์

import sympy
def g(n,m):j=sympy.totient(m);return m-1and pow(n,j+g(n+1,j),m)

ลองออนไลน์!

ทำไมมันถึงได้ผล

เราใช้หลักเกณฑ์ดังต่อไปนี้ทฤษฎีบทออยเลอร์

บทแทรก n 2φ ( m )n φ ( m ) (mod m ) สำหรับnทั้งหมด(หรือไม่ว่าnคือ coprime ถึงm )

พิสูจน์:สำหรับทุกอำนาจนายกพีkแบ่งเมตร ,

  • ถ้าpหารnดังนั้นเนื่องจากφ ( m ) ≥φ ( p k ) = p k - 1 ( p - 1) ≥ 2 k - 1kเรามีn 2φ ( m ) ≡ 0 ≡ n φ ( m ) (mod p k )
  • มิฉะนั้นเพราะφ ( p k ) หารφ ( m ) ทฤษฎีบทของออยเลอร์ให้n 2φ ( m ) ≡ 1 ≡ n φ ( m ) (mod p k )

ดังนั้นn 2φ ( m )n φ ( m ) (mod m )

ควันหลง ถ้าk ≥φ ( m ) ดังนั้นn kn φ ( m ) + ( k mod φ ( m )) (mod m )

พิสูจน์:ถ้าk ≥2φ ( m ), บทแทรกให้n k = n 2φ ( m ) n k - 2φ ( m )n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) และเราทำซ้ำจนกระทั่งเลขชี้กำลังน้อยกว่า2φ ( m )


วิธีนี้จัดการกรณีที่ฐานและ modulo ไม่ใช่ coprime ได้อย่างไร PS sympy มีฟังก์ชั่น totient
orlp

@ หรือฉันได้เพิ่มหลักฐาน sympy.totientไม่แน่ใจว่าฉันพลาด
Anders Kaseorg

ฉันเห็นแล้ว เป็นวิธีที่ดี!
orlp

5

Haskell , 156 ไบต์

(?)ใช้เวลาสองIntegerวินาทีและส่งกลับInteger, ใช้เป็น(10^10)?2017(คำสั่งกลับรายการเมื่อเทียบกับ OP)

1?n=0
m?n=n&m$m#2+m#2?(n+1)
1#_=1
n#p|m<-until((<2).gcd p)(`div`p)n=m#(p+1)*1`max`div(n*p-n)(p*m)
(_&_)0=1
(x&m)y|(a,b)<-divMod y 2=mod(x^b*(mod(x*x)m&m)a)m

ลองออนไลน์! (ฉันใส่เคสเพื่อทดสอบในส่วนหัวในเวลานี้เนื่องจากใช้สัญกรณ์การยกกำลัง)

อยากรู้อยากเห็นกรณีทดสอบที่ช้าที่สุดไม่ได้เป็นหนึ่งที่มีขีด จำกัด ความเร็ว (ที่เกือบจะทันที) แต่524287 ? 32หนึ่งเพราะ524287เป็นนายกมีขนาดใหญ่กว่าที่ปรากฏในปัจจัยของการทดสอบกรณีอื่น ๆ

มันทำงานอย่างไร

  • (x&m)yis x^y `mod` mหรือ power mod โดยใช้การยกกำลังด้วยการยกกำลังสอง
  • n#pเป็นฟังก์ชั่นออยเลอร์ totient ของnสมมติว่ามีปัจจัยสำคัญไม่มีมีขนาดเล็กกว่า np
    • mขึ้นอยู่nกับpปัจจัยทั้งหมดที่แบ่งออก
    • หากมีkปัจจัยดังกล่าว totient ตัวเองควรจะได้รับปัจจัยที่สอดคล้องกันซึ่งคำนวณเป็น(p-1)*p^(k-1)div(n*p-n)(p*m)
    • 1`max`...จับกรณีที่nไม่ได้ลงตัวจริงโดยpซึ่งทำให้อาร์กิวเมนต์อื่น ๆ ของการเท่าเทียมกันmax0
  • ฟังก์ชั่นหลักของm?nการใช้งานว่าเมื่อyมีขนาดใหญ่พอn^y `mod` mเป็นเช่นเดียวกับn^(t+(y`mod`t)) `mod` mเมื่อtเป็น totient mของ ( t+จำเป็นสำหรับปัจจัยสำคัญเหล่านั้นnและmมีเหมือนกันซึ่งทั้งหมดได้รับการขยายให้ใหญ่สุด)
  • อัลกอริธึมหยุดลงเนื่องจากฟังก์ชั่น totient ซ้ำแล้วซ้ำอีกในที่สุดก็ตี 1

1

Mathematica ขนาด 55 ไบต์

n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

ตัวอย่าง:

In[1]:= n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

In[2]:= f[2, 10^15]

Out[2]= 566088170340352

In[3]:= f[4, 3^20]

Out[3]= 4

In[4]:= f[32, 524287]

Out[4]= 16

In[5]:= f[2017, 10^10]

Out[5]= 7395978241

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