Question

Je suis tombé sur cette question:

  

7 Puissance 7 est 823543. Quelle puissance plus élevée de 7 se termine par 823543?

A propos de Comment dois-je faire cavalier? Celui que je suis venu avec est très lent, il continue à multiplier par 7 et 6 contrôles derniers chiffres du résultat d'un match.

J'ai essayé avec le code de Lou:

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);}
            }

Et les sons CPU comme une cocotte-minute, mais n'a pas pu obtenir la réponse: (

Était-ce utile?

La solution

Multiply modulo 10 ^ 6. Voir cette Code Lua .

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

Autres conseils

Vous pouvez utiliser la généralisation d'Euler de

solution force brute dans le python:

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

if __name__ == "__main__":
  check()

Runs dans un peu plus de 10 secondes sur ma machine:

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

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

Pas tellement une réponse, plus un indice:

Notez que le modèle des chiffres plus à droite de puissances de 7 va 1,7,9,3,1,7,9,3,1,7, ... donc il vous suffit de générer toutes les puissances de 7 4e à partir de le 3ème. Une étude plus approfondie pourrait montrer un modèle pour les deux (trois, quatre, ...) chiffres les plus à droite, mais je n'ai pas fait les études pour vous.

Préparez-vous à quelques très grands nombres, Mathematica signale que la prochaine puissance de 7 à la recherché pour les chiffres les plus à droite est le 5007ème.

Ce que je pense que cela répond à votre question - une approche plus rapide est d'afficher sur le SO et attendre que quelqu'un pour vous dire la réponse! Vous pouvez même essayer Wolfram Alpha si vous ne voulez pas l'algorithme SO.

L'approche petit théorème de Fermat est une mathématiquement sensible, et juste mulitplying plus et plus de 7 mod 10 ^ 6 est le code le plus simple, mais il y a une autre approche que vous pourriez prendre c'est informatiquement efficace (mais nécessite un code plus complexe). Tout d'abord, notez que lors de la multiplication par 7 dernier chiffres ne dépend que de la dernier chiffres avant (à savoir que nous faisons tout ce mod 10). Nous multiplions à plusieurs reprises par 7 pour obtenir

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

D'accord, très bien, donc si nous voulons un 3, nous commençons à 7 ^ 3 et grossissent chaque 7 ^ 4 à partir de là. Maintenant, nous notons que lors de la multiplication par 7 ^ 4, les deux derniers chiffres ne dépendent que les deux derniers chiffres de 7 ^ 4 et les deux derniers chiffres de la réponse précédente. 7 ^ 4 est 2401. Donc, en fait, les deux chiffres seront toujours les mêmes lors de la montée de 7 ^ 4.

Qu'en est-il des trois derniers? Eh bien, 7 ^ 3 = 343 et 7 ^ 4 se termine par 401, donc mod 1000 nous obtenons

343 543 743 943 143 343

Nous avons nos trois premiers chiffres dans la colonne # 2 (543), et nous voyons que la séquence se répète jamais 5, donc nous devrions aller de là par 7 ^ 20.

Nous pouvons jouer ce tour encore et encore: trouver combien de fois le bloc suivant des répétitions chiffres, trouver le droit dans ce bloc-séquence, puis multiplier non pas par 7 mais 7 ^ n

.

Ce que nous vraiment faire est de trouver un anneau (multiplicatif) sur le chiffre Mième, puis en multipliant les tailles de tous les anneaux ensemble pour obtenir la durée entre les pouvoirs successifs qui ont les mêmes chiffres N si nous suivons cette méthode. Voici un code Scala (2.8.0 Beta1) qui fait exactement ceci:

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))
}

Donc, si nous avons trouvé un cas des chiffres que nous voulons, nous pouvons maintenant trouver tous en trouvant la taille de l'anneau approprié. Dans notre cas, avec 6 chiffres (à savoir mod 10 ^ 6) et la base 7, nous trouvons une taille de répétition:

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

Alors, nous avons notre réponse! 7 ^ 7 est le premier, le 7 ^ 5007 est le deuxième, 7 ^ 10007 est le troisième, etc ..

nous pouvons Depuis ce générique, essayez d'autres réponses ... 11 ^ 11 = 285311670611 (un numéro à 8 chiffres). Regardons l'intervalle:

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

Alors, cela nous dit que 11 ^ 50000000007 est le numéro suivant après 11 ^ 11 avec le même ensemble initial de 12 chiffres. Vérifiez la main si vous êtes curieux!

Vérifions aussi avec 3 ^ 3 - Quelle est la prochaine puissance de 3 dont les extrémités avec 27 représentation décimale

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

doit être 3 ^ 23. Vérification:

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

Eh oui!


(code Switched dans les modifications à utiliser BigInt afin qu'il puisse gérer un nombre arbitraire de chiffres. Le code ne détecte pas les cas dégénérés, cependant, alors assurez-vous d'utiliser un choix pour la puissance ....)

Une autre astuce: Vous êtes seulement intéressé par les derniers chiffres N: vous pouvez effectuer des calculs modulo 10 ^ N et de garder le résultat en forme bien dans un entier

scroll top