سؤال

تعثرت على هذا السؤال:

7 Power 7 هو 823543. أي قوة أعلى من 7 ينتهي مع 823543؟

كيف يجب أن أذهب حول هذا الموضوع؟ الشخص الذي توصلت إليه بطيء للغاية، فإنه يبقى مضاعفا بنسبة 7 والتحقق من آخر 6 أرقام من النتيجة للمباراة.

حاولت مع رمز لو:

int x=1;
    for (int i=3;i<=100000000;i=i+4){
            x=(x*7)%1000000;
            System.out.println("i="+ i+" x= "+x);
            if (x==823543){
                System.out.println("Ans "+i);}
            }

و CPU يبدو وكأنه طباخ ضغط ولكن لا يمكن الحصول على الجواب :(

هل كانت مفيدة؟

المحلول

اضرب modulo 10 ^ 6. انظر الى هذا قانون لوا.

local x=1
for i=1,100000 do
        x=(x*7) % 1e6
        if x==823543 then print(i) end
end

نصائح أخرى

يمكنك استخدام تعميم المراوغة من نظرية فيرمات الصغيرة الذي يطبق على قضيتك يقول أنه لأي عدد أ هذا غير قابل للقسمة من قبل اثنين أو خمس، أ إلى الطاقة 400000 يساوي 1 modulo 10 ^ 6. مما يعني أن 7 ^ 400000 يساوي واحد و 7 ^ 400007 يساوي 823543 modulo 10 ^ 6

قد تكون هناك صلاحيات أصغر من 7 تساوي أيضا مودم واحد 10 ^ 6. يجب أن تكون أي قوة من هذا القبيل مقسمة من 400000. لذلك إذا قمت بتبحث في جميع مقصات 400000، يجب أن تجد إجابتك.

حل القوة الغاشمة في بيثون:

def check():
    i = 8
    while True:
        if str(7**i)[-6:] == "823543":
            print i, 7**i
            break
        i += 1

if __name__ == "__main__":
  check()

يعمل في TAD أكثر من 10 ثوان على جهازي:

$ time python 7\*\*7.py 
5007 25461638709540284156782446957365168367138070393489656084508152816071765490828583739345420574947301301356529652113030016806506783009529977928336772622054260724106711204039012806363481521302203821096274017061906820115931889920385802499836705571461280700786627503189500663279772123190279763997339608040949194040289041117811256914511855302927500076094761237077649092849658261309060277197389760351907599243227298336309204635761799394324969277220810221310805265921431367291459357151617279190810954501590069774137519833706444943573459910208627100504003480684029216932299650285683013274883359754231186580602570771682084721896446416234857382909168309309630688331305154545352580787700878011742720440707156231891841057992434850068501355342227582074144717324718396296563918284728120322255330707786227631084119636101174217518654320128390401231343058708073280898554293777842571799775647325449392944570725467462072394864457569308219294304248413378339223195121800534783732295135735588409249690562213409520783181313960347723827308102920022860541043691808218543350580271593107019737918976365348051012746817678592727727988993175444584453532474156202438866838819565827414970029052602274354173178190323239427022953097424087683011937130778414189673555875258508014323428137406618951161046883845551087123412471364400737145434714864392224194773030522352601143771552489895838728148761974811275894561985163094852437703080985644653666048979901975905667811053289029958524703063742007291722490298429637413913574845245364780928447142275001431370017543206188428912106120676556219532197108435997375879569102044435752697298456147512203108094030745606163915437604076966518127099543894645297945324345093247636119593298654296614887389164509070158924404441687810434488061150620012547321097786493748417764592151734279632949607485719050349385098350202294648324398902047614892248381794929374952059877187100434970751833289677556040879755065563758085919673107576808662549999202791489324437408075089456174056904323973798979207791446889016369166632636035638123394649891606479407561222474471530411700646266636732205895085248823824764170316644547100628119484733814900100986786082211477261114056206393554335903410036064553032366200714266053598548735147707681592574886559888869327771461046450774938490837810526377213647071217152427693219479552580138352651791476758476864761332281826701978038126122728967682552206820425685782165630494478519812498630475776384700259524274670258777572341538755828794632819515842335609785884327007667337426644594091547392441314523035569100326662245947022517857248412004291423280879791576077952474202068318934524092750814844945529148131063116233331840380254781283689084385600858175504170157015630699919186013526052643206240745256569669847298952477441594748635701081031979500954081732722211598460098426985932512920424237248250698541558227081975966598720056015879151923686438360541128221854058867910136449528237543680180470919685862102358708465872395643586424250239281775923511452769821487580471289910257908740451431952197725174728917413539539795856895884961513784804247268727165303942024508367184898248006123651950710237279288601317817391869969699767431782664773248447758526620050588927086506013616563459173620496200348863132442180734592661348887012997849309740799709045762939781801481205704629203758859772476278892928066844445088880207986848424855774325574728566649552154520262460969975214802828263093097997124519153537792591659204109087699977445745067857471581656151077039286563447099850537157044829081400190710358959493358343935904669416958301921942118288210835104022359479660409954097409669785908666166908117346073702337825511531650740900904200220658196171839969860945908503151878488455004283026700303698398069644419655035582904253655945381261383285097911378914794161551292914993411444083214513058414480129560671193659591364146612550890288116403596333209446976453193340267725222134755872075133141618388704912211996423838163706006930973361661094103734887312836613195349528793780496172839376426055357343094188450140671138356505144988151110902047791487250988374130384058324229250761311655685931891857894126054047458969174494155762486464149775147410127618088224310828566286409277000561087588768230619606746804073498788244935099280434916850444895829823543

real    0m10.779s
user    0m10.709s
sys 0m0.024s

ليس الكثير من الإجابة، أكثر تلميحا:

لاحظ أن نمط الأرقام اليمنى من صلاحيات 7 يذهب 7،7،3،3،7،9،9،7،7، ... لذلك تحتاج فقط إلى توليد كل قوة 4 من 7 من 3. قد تظهر المزيد من الدراسة نمطا لشخصين (ثلاثة، أربعة، ...) أقصى اليمين، لكنني لم أفعل درسهم لك.

كن مستعدا لبعض أعداد كبيرة جدا، الرياضيات تقارير تفيد بأن القوة التالية من 7 مع أرقام أقصى اليمين المطلوبة هي 5007.

الذي أعتقد أن الإجابات على سؤالك - نهج أسرع هو نشر ذلك وانتظر لشخص ما أن يخبرك بالجواب! يمكنك حتى تجربة Wolfram Alpha إذا كنت لا تحب الخوارزمية حتى.

يعد نهج Fermat Little Little Atternible وهو واحد معقول رياضيا، وتمتد أكثر من 7 mod 10 ^ 6 هو أبسط رمز، ولكن هناك نهج آخر يمكن أن تتخذه هو الكفاءة الحسابية (ولكن يتطلب رمز أكثر تعقيدا). أولا، لاحظ أنه عند مضاعفة 7 الاخير الرقم يعتمد فقط على الاخير رقم من قبل (أي نحن نفعل كل شيء وزارة الدفاع 10). نتضاعف مرارا وتكرارا بنسبة 7 للحصول على

7  (4)9  (6)3  (2)1 (0)7 ...

حسنا، عظيم، لذلك إذا كنا نريد 3، نبدأ في 7 ^ 3 وتصعد كل 7 ^ 4 من هناك. الآن، نلاحظ أنه عندما يتضاعف بنسبة 7 ^ 4، فإن آخر رقمين يعتمدان فقط على رقمين آخرين من 7 ^ 4 والأرقام الأخيرين من الإجابة السابقة. 7 ^ 4 هو 2401. لذلك في الواقع الأخير اثنين سوف تكون الأرقام هي نفسها دائما عند الارتفاع بنسبة 7 ^ 4.

ماذا عن الثلاثة الأخيرة؟ حسنا، 7 ^ 3 = 343 و 7 ^ 4 ينتهي ب 401، لذلك وزارة الدفاع 1000 نحصل عليه

343 543 743 943 143 343

لدينا أرقامنا الثلاثة الأولى في العمود رقم 2 (543)، ونحن نرى أن التسلسل يتكرر من أي وقت مضى 5، لذلك يجب أن نذهب من هناك بنسبة 7 ^ 20.

يمكننا أن نلعب هذه الخدعة مرارا وتكرارا: ابحث عن عدد المرات التي تتكرر الكتلة التالية من الأرقام، والعثور على الحظر الأيمن ضمن تلك الكتلة، ثم لا تضرب حتى 7 ولكن بنسبة 7 ^ n.

ما نقوم به حقا هو العثور على خاتم (مضاعف) على رقم M'TH، ثم ضرب أحجام جميع الحلقات معا للحصول على تمتد بين القوى المتتالية التي تحتوي على نفس أرقام N إذا اتبعنا هذه الطريقة. إليك بعض كود Scala (2.8.0 Beta1) الذي يفعل هذا فقط:

def powRing(bigmod: BigInt, checkmod: BigInt, mul: BigInt) = {
  val powers = Stream.iterate(1:BigInt)(i => (i*mul)%bigmod)
  powers.take( 2+powers.tail.indexWhere(_ % checkmod == 1) ).toList
}
def ringSeq(digits: Int, mod: BigInt, mul: BigInt): List[(BigInt,List[BigInt])] = {
  if (digits<=1) List( (10:BigInt , powRing(mod,10,mul)) )
  else {
    val prevSeq = ringSeq(digits-1, mod, mul)
    val prevRing = prevSeq.head
    val nextRing = powRing(mod,prevRing._1*10,prevRing._2.last)
    (prevRing._1*10 , nextRing) :: prevSeq
  }
}
def interval(digits: Int, mul: Int) = {
  val ring = ringSeq(digits, List.fill(digits)(10:BigInt).reduceLeft(_*_), mul)
  (1L /: ring)((p,r) => p * (r._2.length-1))
}

لذلك، إذا وجدنا واحد حالة الأرقام التي نريدها، يمكننا الآن العثور عليها جميعا من خلال إيجاد حجم الحلبة المناسبة. في حالتنا، مع 6 أرقام (أي وزارة الدفاع 10 ^ 6) والقاعدة 7، نجد حجم متكرر:

scala> interval(6,7)                                                           
res0: Long = 5000

لذلك، لدينا إجابتنا! 7 ^ 7 هو الأول، 7 ^ 5007 هو الثاني، 7 ^ 10007 هو الثالث، إلخ.

لأن هذا عام، يمكننا تجربة إجابات أخرى ... 11 ^ 11 = 285311670611 (رقم 8 أرقام). دعونا ننظر إلى الفاصل الزمني:

scala> interval(12,11)            
res1: Long = 50000000000

لذلك، هذا يخبرنا أن 11 ^ 500000007 هو الرقم التالي بعد 11 ^ 11 مع نفس المجموعة الأولية من 12 رقما. تحقق باليد إذا كنت فضوليا!

دعنا نتحقق أيضا مع 3 ^ 3 - ما هي القوة التالية التي تنتج التوسع العشري مع 27؟

scala> interval(2,3)
res2: Long = 20

يجب أن يكون 3 ^ 23. تدقيق:

scala> List.fill(23)(3L).reduceLeft((l,r) => {println(l*r) ; l*r})
9
27
81
243
729
2187
6561
19683
59049
177147
531441
1594323
4782969
14348907
43046721
129140163
387420489
1162261467
3486784401
10460353203
31381059609
94143178827

نعم!


(تبديل التعليمات البرمجية في التعديلات لاستخدام bigint بحيث يمكن التعامل مع الأرقام التعسفية من الأرقام. لا يكشف الكود الحالات المتدهورة، لذلك تأكد من استخدام ما رئيسا للسلطة ....)

تلميح آخر: أنت مهتم فقط بأرقام N الأخيرة: يمكنك إجراء العمليات الحسابية Modulo 10 ^ n والحفاظ على النتيجة تناسب بشكل جيد في عدد صحيح

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top