ค้นหารูท 10-adic cube ของ 3


24

ฉันชอบคิดเลข 10 adic เป็นตัวเลขที่ไปทางซ้ายไม่ จำกัด หรือโมดูโลจำนวนเต็มเป็นพลังงานที่มีขนาดใหญ่มากของ 10

สิ่งต่าง ๆ ดำเนินไปทางซ้ายและหายไป หากต้องการดูสิ่งที่ฉันหมายถึงโปรดทราบว่า...6667 * 3 = 1ในดินแดน 10 adic ตั้งแต่ "2" ที่ดำเนินการไปทางซ้ายจะไม่มีที่สิ้นสุด

การเพิ่มและการคูณทำให้เข้าใจได้สำหรับตัวเลข 10 adic เนื่องจากnตัวเลขสุดท้ายของผลรวม / ผลิตภัณฑ์จะขึ้นอยู่กับnตัวเลขสุดท้ายของการสรุป / การคูณ


ป.ร. ให้nไว้คุณจะต้องพิมพ์nตัวเลขสุดท้ายของราก 10-adic คิวบ์ที่ 3 คือที่xน่าx*x*x = 3พอใจ

มันจบลงแล้ว:

...878683312291648481630318492665160423850087895134587

รหัสของคุณจะต้องยุติn=1000ก่อนส่ง

สมมติว่าถ้าจำนวนที่คุณต้องการพิมพ์เริ่มต้นด้วยศูนย์คุณไม่จำเป็นต้องพิมพ์เลขศูนย์นำหน้าเพราะมันไม่ใช่จุดที่จะพิมพ์เลขศูนย์พิเศษ


นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์



1
เราจำเป็นต้องพิมพ์เลขศูนย์นำหน้าด้วยหรือไม่ คำตอบส่วนใหญ่ (รวมถึงคำตอบ Java ของฉัน) ในขณะนี้ล้มเหลวสำหรับเหล่านั้น เช่นn=12การแสดงผลแทน87895134587 087895134587ส่วนตัวผมจะทำให้มันไม่จำเป็นเพราะมันจะทำให้การเกือบทุกคำตอบ ..
เควิน Cruijssen

@KevinCruijssen เสร็จแล้ว
Leaky Nun

คำตอบ:


26

Python 2 , 33 ไบต์

lambda k:pow(3,10**k*2/3+1,10**k)

ลองออนไลน์!

ฟังก์ชั่นได้อย่างมีประสิทธิภาพคำนวณสัญลักษณ์แบบแยกส่วนpow3**(10**k*2/3+1)%10**k

r**3 = 3 (mod 10**k)เรากำลังขอให้หาทางออกไป เราต้องการค้นหาเลขชี้กำลังeซึ่งมีการผังผังx -> x**eผกผันกับตัวดัดแปลงx -> x**3การทำงานแบบCubing 10**kเช่นเดียวกับการถอดรหัสและเลขชี้กำลังการเข้ารหัสใน RSA ยกเลิกเพื่อสร้างค่าดั้งเดิม ซึ่งหมายความว่าสำหรับทุก(x**3)**e = x (mod 10**k) x(เราจะถือว่าตลอดว่าgcd(x,10) = 1.) จากนั้นเราสามารถกู้คืนrโดย inverting cubing r = 3**e (mod 10**k)ที่จะได้รับ

ขยายออก(r**3)**e = r (mod 10**k)เราจะได้รับ

r**(3*e-1) = 1 (mod 10**k)

เรากำลังมองหาตัวแทนที่รับประกันว่าคูณที่หลายเล่มจะช่วยให้เรา3*e-11

โมดูโลคูณรูปแบบกลุ่มสำหรับตัวเลขผกผันได้ว่าเป็นผู้ที่มี10**k gcd(x,10) = 1โดยทฤษฎีบทของลากรองจ์x**c = 1ที่cนับองค์ประกอบในกลุ่ม สำหรับโมดูโลกลุ่มNนับว่าเป็นค่า totient ออยเลอร์φ(N)จำนวนค่าจาก1การที่มีความสำคัญที่จะN ดังนั้นเรามีN r**φ(10**k) = 1 (mod 10**k)ดังนั้นพอเพียงสำหรับการเป็นหลาย3*e-1φ(10**k)

เราคำนวณ

φ(10**k) = φ(5**k) φ(2**k)= 4 * 5**(k-1) * 2**(k-1) = 4 * 10**(k-1)`

ดังนั้นเราต้องการ3*e-1ที่จะเป็นหลาย4 * 10**(k-1)

3*e - 1 = r * 4 * 10**(k-1)
e = (4r * 10**(k-1) + 1)/3

ตัวเลือกมากมายเป็นไปได้สำหรับrแต่r=5ให้การแสดงออกสั้น

e = (2 * 10**k + 1)/3

ด้วยeจำนวนเต็ม กอล์ฟน้อยใช้น้อยลงจากพื้นส่วนeไป10**k*2/3+1และแสดงให้ผลลัพธ์ที่ต้องการr = 3**e (mod 10**k)r


1
ฉันต้องการดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของมันคำตอบที่ดีมาก!
Kritixi Lithos

ควร(r**3)**e = x (mod 10**k)เป็น(r**3)**e = r (mod 10**k)อย่างไร นอกจากนี้ยังเป็นเรื่องบังเอิญที่(2 * 10**k + 1)/3 = 1/3 (mod 10**k)?
H.PWiz

@ H.PWiz ใช่ขอบคุณฉันแก้ไขมัน ฉันไม่แน่ใจว่าการเป็นอินเวอร์สสำหรับ 3 นั้นเป็นเรื่องบังเอิญหรือไม่ แน่นอนว่ามันไม่เพียงพอเนื่องจากการแทนที่ 2 ด้วยค่าอื่นไม่ทำงาน
xnor

@ xnor ฉันคิดว่ามันเพียงพอ คุณควรจะสามารถแทนที่เพื่อแทนที่2ด้วยหมายเลขใด ๆx = 2 (mod 3)
H.PWiz

ตามปกติคณิตศาสตร์ชนะ!
Olivier Grégoire

18

Python 2 (PyPy) , 55 50 ไบต์

-5 ไบต์ขอบคุณ@HP Wiz !

n=p=1;exec"p*=10;n+=3*(3-n**3)%p;"*input();print n

ลองออนไลน์!

คำนวณตัวเลขที่ไม่ใช่เดรัจฉานโดยตัวเลขดังนั้นมันจึงเร็วกว่าแรงเดรัจฉาน

เวอร์ชันที่ไม่มี exec

คำอธิบาย

(ขอบคุณ@Leaky Nunและ @ user202729สำหรับการหาสิ่งนี้)

ครั้งแรกที่สังเกตได้ว่าn**3เป็นโมดูโล 10 ร่วมด้วย (เช่นถ้าฟังก์ชั่นที่เรียกว่าfแล้วf(f(n)) == n) สิ่งนี้สามารถยืนยันได้โดยใช้การค้นหาแบบละเอียด

เราสามารถใช้การเหนี่ยวนำทางคณิตศาสตร์เพื่อค้นหาตัวเลขถัดไป
อนุญาตเป็นตัวเลขหลักของตัวเลข (จากด้านขวา)dnn

d 1 3 ≡ 3 (mod 10)
 d 1 ≡ 3 3 (mod 10)
    ≡ 27 (mod 10)
    ≡ 7 (mod 10)

ทีนี้สมมติว่าเรารู้จำนวนถึงkหลักที่x

              x 3 ≡ 3 (mod 10 k )
  (d k + 1 · 10 k + x) 3 ≡ 3 (mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 ) (การขยายแบบทวินาม)
(โปรดทราบว่าสามารถละเว้นอีกสองคำศัพท์เนื่องจากเป็น 0 mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

เรารู้ว่า:

       x ≡ 7 (mod 10)
      x 2 ≡ 49 (mod 10)
         ≡ 9 (mod 10)
  x 2 · 10 k ≡ 9 · 10 k   (mod 10 k + 1 )
3 · x 2 · 10 k ≡ 27 · 10 k (mod 10 k + 1 )
         ≡ 7 · 10 k   (mod 10 k + 1 )

แทนสิ่งนี้ใน:

3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
  7 · d k + 1 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
             d k + 1 ≡ (3 - x 3 ) ÷ (7 · 10 k ) (mod 10)
                 ≡ (3 - x 3 ) ÷ (7 · 10 k ) (mod 10)
           ∴ d k + 1 ≡ 3 · (3 - x 3 ) ÷ 10 k    (mod 10) (3 คือค่าผกผันของ 7 mod 10)

อันที่จริงวิธีนี้มีแนวโน้มที่จะเหมาะสมที่สุด (สำหรับภาษาส่วนใหญ่ที่สูตรน้อยกว่าการบังคับเดรัจฉาน) คำอธิบายสามารถพบได้ในแชทแม้ว่าจะกระจัดกระจาย
user202729

หากคุณมุ่งหวังที่จะเล่นกอล์ฟ "non-exec" วิธีนี้ใช้ได้กับ 62 ไบต์เป็นโปรแกรมเต็มรูปแบบแทนที่จะเป็นฟังก์ชั่น
Mr. Xcoder

นี้เพียงพิมพ์ที่ผ่านมา11ตัวเลขสำหรับและn=12 n=13
Emigna

4
×และ x ดูคล้ายกันมากในบางฟอนต์และทำให้คณิตศาสตร์ยากต่อการอ่าน ฉันขอแนะนำให้ใช้· (จุดกลาง) แทน×ได้ไหม (และแน่นอนว่ามันจะดีถ้ามี MathJax )
Peter Taylor



4

05AB1E , 17 13 ไบต์

7IGD3mN°÷7*θì

ท่าเรือ@ ASCII เท่านั้น 's งูหลาม 2 (PyPy) คำตอบ
-4 ไบต์และข้อผิดพลาดคงที่สำหรับเอาท์พุทที่มีเลขศูนย์นำขอบคุณที่@Emignaโดยการเปลี่ยนด้วยT%N°*+θì

ลองออนไลน์

คำอธิบาย:

7               # Start result-string `r` at '7'
IG              # Loop `N` in the range [1, input)
  D3m           #  `r` to the power 3
       ÷        #  Integer-divided with
     N°         #  10 to the power `N`
        7*      #  Multiplied by 7
          θì    #  Then take the last digit of this, and prepend it to the result `r`
                # Implicitly output result `r` after the loop

HPWiz ได้แข็งแรงเล่นกอล์ฟวิธีการของฉันและความท้าทายไม่ต้อง zeroes ชั้นนำเพื่อให้คุณอาจจะสามารถที่จะเล่นกอล์ฟมากขึ้น?
ASCII เท่านั้นเท่านั้น

@ ASCII เท่านั้นบางที แต่ไม่แน่ใจว่าเป็นอย่างไร @Emignaได้ตีกอล์ฟT%N°*+ให้θìกับฉันแล้วและ 'ศูนย์' ชั้นนำก็เป็นเพียงโบนัสที่ดีสำหรับวิธีนี้
Kevin Cruijssen

4

Java 8, 158 156 141 136 135 ไบต์

n->{var t=n.valueOf(3);var r=n.ONE;for(int i=0;i++<n.intValue();)r=r.add(t.subtract(r.pow(3)).multiply(t).mod(n.TEN.pow(i)));return r;}

ท่าเรือ@ ASCII เท่านั้น 's งูหลาม 2 (PyPy) คำตอบ
-2 ไบต์ขอบคุณที่@Neil
-20 ไบต์ขอบคุณที่@ ASCII เท่านั้น

หมายเหตุ: มีอยู่แล้วคำตอบ Java สั้นมากโดย@ OlivierGrégoiremodPowโดยใช้วิธีการใช้อัลกอริทึม

ลองออนไลน์

คำอธิบาย:

n->{                            // Method with BigInteger as both parameter and return-type
  var t=n.valueOf(3);           //  Temp BigInteger with value 3
  var r=n.ONE;                  //  Result-BigInteger, starting at 1
  for(int i=0;i++<n.intValue();)//  Loop `i` in the range [1, n]
    r=r.add(                    //   Add to the result-BigDecimal:
       t.subtract(r.pow(3))     //    `t` subtracted with `r` to the power 3
       .multiply(t)             //    Multiplied by 3
       .mod(n.TEN.pow(i)));     //    Modulo by 10 to the power `i`
  return r;}                    //  Return the result-BigInteger

โอ้คุณใช้อัลกอริทึมนั้นด้วยหรือไม่ ฉันจะย้อนคำตอบของฉันและเพิ่มการเปลี่ยนแปลงให้คุณ;)
Olivier Grégoire

java.math.BigInteger u=null,r=u.valueOf(7),t=r;?
Neil

@ นีลแน่นอน .. ขอบคุณ ฉันมีjava.math.BigInteger t=null,r=u.valueOf(7);t=r;ตอนแรกก่อนที่ฉันจะเพิ่มการuบันทึกบางไบต์
Kevin Cruijssen


1
* modpow ไม่ใช่ modpod: P
ASCII เท่านั้น

4

Java (JDK 10) , 106 ไบต์

n->n.valueOf(3).modPow(n.valueOf(2).multiply(n=n.TEN.pow(n.intValue())).divide(n.valueOf(3)).add(n.ONE),n)

ลองออนไลน์!

เครดิต


1
166 ไบต์โดยการเปลี่ยนวงไปfor(int l=0,d;++l<=n;และการเปลี่ยนแปลงBigInteger I=null;เพื่อvar I=new BigInteger("3");ที่เราสามารถกลับมาใช้
Kevin Cruijssen

1
1 for(int l=0,d;l++<n;)ไบต์มากขึ้นในการบันทึกโดยการเปลี่ยนวงไป
Kevin Cruijssen




1

Pyth , 23 ไบต์

แน่นอนว่าวิธีนี้ใช้แนวทางของ ASCII เท่านั้น

K7em=+K*%*7/^K3J^TdTJtU

ลองที่นี่!


1
@DigitalTrauma โอ้> _ <ฉันสาบานฉันไม่ได้สังเกตคำตอบของคุณ lol ... ฉันมีพอร์ตของ ASCII เป็นอันดับแรกจากนั้นฉันเห็น xnor และฉันส่งพอร์ตไปยังกอล์ฟโดยตรง: PI ฉันจะย้อนกลับไปแก้ไขครั้งแรก แม้ว่า
นาย Xcoder

1

ถ่าน , 26 22 ไบต์

≔⁷ηFN≧⁺﹪׳⁻³Xη³Xχ⊕ιηIη

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน คำอธิบาย:

≔⁷η

เริ่มต้นผลลัพธ์ที่ 7 (ไม่จำเป็นต้องเป็น 7 แต่ 0 ไม่ทำงาน)

FN

วนซ้ำตามจำนวนหลักที่ต้องการ

        η       Current result.
       X ³     Take the cube. 
     ⁻³         Subtract from 3.
   ׳           Multiply by 3.
            ⊕ι  Increment the loop index.
          Xχ    Get that power of 10.
  ﹪             Modulo
≧⁺            η Add to the result.

ตอนนี้ใช้วิธีการของ @ HPWiz เพื่อประหยัด 4 ไบต์

Iη

พิมพ์ผลลัพธ์

นี่เป็นรุ่นบังคับเดรัจฉาน 28 ไบต์ที่นำรูตคิวบ์ของค่าที่กำหนดเอง:

FN⊞υ⊟Φχ¬﹪⁻XI⁺κ⭆⮌υμ³IηXχ⊕ι↓Iυ

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน อินพุตแรกคือจำนวนดิจิตที่สองคือค่ารูท


HPWiz ได้อัปเดต (อ่าน: กอล์ฟ) แนวทางของฉัน นอกจากนี้ไม่ควรใช้ stringmap อีกต่อไปเนื่องจาก Leaky Nun ได้อัปเดตข้อกำหนดแล้ว ลิงก์แรกยังชี้ไปยังรุ่นเดรัจฉาน> _>
ASCII เท่านั้น

@ ASCII- เพียงอย่างเดียวขอบคุณฉันได้แก้ไขลิงก์และแนวทางของ HPWiz แล้ว แต่ฉันต้องการให้ StringMap เชื่อมต่อkกับรายการที่กลับด้านเป็นหมายเลขฐาน 10
Neil

อืมมม ฉันคิดว่าแค่ทำตามวิธีหมายเลขธรรมดาอาจจะเป็นนักกอล์ฟ ฉันเดาไม่ได้ว่า
ASCII- เท่านั้น

@ ASCII-only สำหรับเวอร์ชันก่อนหน้านี้ที่ฉันใช้Base(Reverse(u), 10)แต่การเติมหน้าkจะมีค่าใช้จ่าย 4 ไบต์ในขณะที่ทำมันเป็นสตริงมีค่าใช้จ่ายเพียง 2 ไบต์ทำให้ประหยัด 1 ไบต์หลังจากที่Castพิจารณา
Neil


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