素数和斐波那契数列

时间:2016-12-07 03:30:31

标签: python python-3.x primes fibonacci

嗯,让我们说我们有两个数组,其中我们有一个素数序列和一个Fibonacci序列,例如。

  

Fib = [1,1,2,3,5,8]

  

Pr = [2,3,5,7,11,13]

我需要找到前两个数字

  

(Fib [n1]%Pr [n1])== 0和(Fib [n2]%Pr [n2])== 0

我的代码在语法上似乎很好,但在找到这些数字时速度很慢。任何帮助都会受到赞赏。

代码:

import math
def main():
    def Fib(n):
        v1, v2, v3 = 1, 1, 0   
        for rec in bin(n)[3:]:  
            calc = v2*v2
            v1, v2, v3 = v1*v1+calc, (v1+v3)*v2, calc+v3*v3
            if rec=='1':    v1, v2, v3 = v1+v2, v1, v2
        return v2
    def PrimeNum(n):
        P = ["",2]
        i = 3
        while len(P)!=(n+1):
            z = True
            if math.sqrt(i) == int(math.sqrt(i)):
                z = False
            else:
                j = 2
                while j<math.sqrt(i):
                    if i%j == 0:
                        z = False
                        break
                    j += 1
            if z == True:
                P.append(i)
            i += 2
        return P
    n1 = 0
    n2 = 0
    i = 1
    while Fib(i)%PrimeNum(i)[i] != 0:
        i+=1
    n1 , i = i , n1+1
    while Fib(i)%PrimeNum(i)[i] != 0:
        i+=1
    n2 = i
    print (n1+n2)
main()

2 个答案:

答案 0 :(得分:2)

import math


def Fib(n):
    v1, v2, v3 = 1, 1, 0
    for rec in bin(n)[3:]:
        calc = v2 * v2
        v1, v2, v3 = v1 * v1 + calc, (v1 + v3) * v2, calc + v3 * v3
        if rec == '1':    v1, v2, v3 = v1 + v2, v1, v2
    return v2


def isPrime(n):
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif (n % 2 == 0) or (n % 3 == 0):
        return False
    i = 5

    while i**2 <= n:
        if (n % i == 0) or ((n % (i+2)) == 0):
            return False
        i += 6
    return True


def PrimeNum(n):
    if n == 1:
        return 2
    else:
        i = 1
        counter = 1
        while counter < n:
            i += 2
            while not isPrime(i):
                i += 2
            counter += 1
        return i


def main():
    numbers = []
    n = 1
    while len(numbers) < 2:
        prime = PrimeNum(n)
        fib = Fib(n)
        if (fib % prime) == 0:
            numbers.append((n, prime, fib))
        n += 1
        print(n)

    print(numbers)

if __name__ == '__main__':
    main()

输出:

[(2160, 19009, 11582916825736584646975443653366322388921641167905180075281721851717008301903980437476277463379606054064279901980733340808520924624506359466585610824954684399084897922087504296705002387813173728581009860851320738456488209562894492182740289488332663607728717459344508234312101775586816401162288539598276213213951642360269055931032970100599429340189881639747365248788048662076913003130071131663108327512733069326012197090400460556913764055449808782413120), (3048, 27941, 4414103171422717935355962509499454349778622162400781459697552399266028998073052301861983592098091170325382922374854427709365699448595338643109175128231512749180137239630552350668736159301331619783913278988698914397585103122958242938481707043703775239751032229629764002510837997551552225537574210211945427154275570535341744487610518195389286251136162913276874919649834195343551175847369401914668124502580414188411921940167995410000017796803115148941554642484534655371013695818145603303564888547079314332213882853124811024475730089466430117462078329371553861038010496072275843988120946471902434970719656034482802077255302581089149251082976)]

答案 1 :(得分:2)

On Edit :正如@WillNess指出的那样,我原来基于筛选的生成素数的方法不是最理想的。我修改了素数发生器。

对于每个n,您在计算nth斐波那契数时重建所有先前的斐波纳契数。这使得用于在n中生成至少二次方的斐波纳契数的算法 - 不是计算线性递归项的好方法。

与每个n类似,您正在测试n是否由原始试验部门提供。将已经计算过的素数存储到流线那部分更有意义,并且只测试奇数(在2之后)作为下一个素数。

这样的事情:

from math import sqrt

def isPrime(k,known):
    """assumes k is odd and known includes odd primes <= sqrt(p)"""
    s = sqrt(k)
    for p in known:
        if k % p == 0:
            return False
        elif p > s:
            return True

def primes():
    yield 2
    yield 3
    yield 5
    known = [5] #known odd primes > 3. Iteration skips multiples of 3
    candidate = 7
    parity = 1

    while True:
        while not isPrime(candidate,known):
            candidate += (2 + 2*parity)
            parity = 1 - parity
        yield candidate
        known.append(candidate)
        candidate += (2 + 2*parity)
        parity = 1 - parity



def fib():
    yield 1
    a = 1
    b = 1
    while True:
        yield b
        a,b = b, a+b

def search(k, limit = 100000):
    """searches for the first k examples among first limit pairs"""
    hits = []
    for i,(f,p) in enumerate(zip(fib(),primes())):
        if i > limit:
            return "Not found"
        elif f % p == 0:
            hits.append((i,f,p))
            if len(hits) == k: return hits

调用search(2)时,它几乎立即返回:

[(2159, 11582916825736584646975443653366322388921641167905180075281721851717008301903980437476277463379606054064279901980733340808520924624506359466585610824954684399084897922087504296705002387813173728581009860851320738456488209562894492182740289488332663607728717459344508234312101775586816401162288539598276213213951642360269055931032970100599429340189881639747365248788048662076913003130071131663108327512733069326012197090400460556913764055449808782413120, 19009), (3047, 4414103171422717935355962509499454349778622162400781459697552399266028998073052301861983592098091170325382922374854427709365699448595338643109175128231512749180137239630552350668736159301331619783913278988698914397585103122958242938481707043703775239751032229629764002510837997551552225537574210211945427154275570535341744487610518195389286251136162913276874919649834195343551175847369401914668124502580414188411921940167995410000017796803115148941554642484534655371013695818145603303564888547079314332213882853124811024475730089466430117462078329371553861038010496072275843988120946471902434970719656034482802077255302581089149251082976, 27941)]

为了好玩:

>>> search(3)
[(2159, 11582916825736584646975443653366322388921641167905180075281721851717008301903980437476277463379606054064279901980733340808520924624506359466585610824954684399084897922087504296705002387813173728581009860851320738456488209562894492182740289488332663607728717459344508234312101775586816401162288539598276213213951642360269055931032970100599429340189881639747365248788048662076913003130071131663108327512733069326012197090400460556913764055449808782413120, 19009), (3047, 4414103171422717935355962509499454349778622162400781459697552399266028998073052301861983592098091170325382922374854427709365699448595338643109175128231512749180137239630552350668736159301331619783913278988698914397585103122958242938481707043703775239751032229629764002510837997551552225537574210211945427154275570535341744487610518195389286251136162913276874919649834195343551175847369401914668124502580414188411921940167995410000017796803115148941554642484534655371013695818145603303564888547079314332213882853124811024475730089466430117462078329371553861038010496072275843988120946471902434970719656034482802077255302581089149251082976, 27941), (27093, 9154611756214756724173885190408003872449591269073102605228456275421208215932565362931929654546649304023236344043061900343945422952312397120822618708723071089543994689417534274219382267837418988544430955958634578186146315678653949605935409450055790001104946147407316311473901552255789990255560458743971937801679393705446136261518016083185450683814066644274897534221110708848082023454498620988462247604771107063854440837945572552841406526401192557118031116749129168215879638214765494261573532277267248651864394801267996413906424450730419095713253333326504619013654894156288241737988067918591507737206648058569934516619420144623505377301435668514418593118878788775849264442773570236710982356483749339325612961955144121852617030353522266206195503391667491427262341962604316852915673071607898002570374470506997388337604296115573269049069634099324411619052448132528877435091667009229816989818556680426118774810238582636027323802599258271991479814852819141878003265064480606587244021927725713293228979923827422432692586158272135063549520191382577769000483431081463036690550524564226586425639020224650313666850943741943605246548446573870629218059701374187171356525816670387118159122398327173724524855658200110122522835176190387328244551014672164462460351372690457712069935724023091919036138410906797524707392410554446350077959242405947099126465838760766371777403033146251749502951971723164017865200568964463774297505017369007733498550947322388608760212335940368621783904555284384376776656261924863794343796815840394007873484565022848579462774052069439946777630573102979496590395316870340899551813282502986710070529378861792991385680534480763081222794445860234260101963233469819968478267781058165962215892733089244018231780105097548621006518924522684510451706606468473417782105562726421667458599325050626566145642109892327168775105402123881849220660482291948715812488950704140069539809853344947732388220095254658324470691606583872184849553953678352230667797760550750875445274878011552908141893541049214761478631614429073173072195839699424914223620432036633802986310860934484009114489007981128832162565709338385636160750356924485343604148697926502326166202557944994913633051828299661050405190916615302885951550480867328010617078304297055489653587862296405779015531981276461702240597546551137530304640351560899721596431710387198320317078019194398346106906325232766448980878644774607110433151004714381896844981823117568831262694359188988036994358418407531621088012313911112990787883908629473366729105235570919108365315772383671485216041535895199802233506396125361100590961904686232499367884224371237416713503169202893109931633850881704747136301856000860027043777582090218562843855449359939394306400414888273691232591121594524381819354582423430557415390250709297250916474909569851542211629963074881157328576497818802346387745923866756229123554832128989541520169936300953836300235389379093109442248393586494022605971670012623627311681211479804894428255735216832312332374587671329106796684022978470999078866754294893462641324866080667457196130998327268153752398794195850817076787793178090421859530598534071035337698763058968997892119530295325366370181024862996688996982218234484156138212120039174745114551380799834389352242746434596156561884802858552848039130654598584670423370789192360682663573402610067394573907023581267337444561887066225448640531109903737583527982043515262559110647745958317794321134493638412203902264050559048131283893050978643459005295587397025818844745289630423132369876077023573075795101695741941448957492692770541027257813143549818083247077466563300619633483770879467622427653718311051255568315886707370049330370551248083587163093648392436402538080835372938539661876694968429300607645700887451607717345890164088866738067437705736191409017874160533226574366616228364590208669132008603977373406173169617176940813788990290600726024523687722649543950416403252632629816054630374545316484236530285427928212536677046788146607820784957497688177505215507738764368094945972293925768102942894343922075951950584747843163041482179651582945321367224573871167076773239474546718093054690180737239167052175372000610893947129090802650539145357698139189391292101318833102423529064084510914322440126808385923038318201245755676704650611731596292583717304379370256996717858556466693113975077196901855204797418153369689670038673829781023407381326668723988156703032126856483599703246194765161592028779525610900396244517331650235058027054924312880572459575090013084993690584284681466416902902178987116510671639573471785558879473018150310384889626008363718980810299980477673370182512022494547611737471877682888208577935567297869927069037836778041611528430972865356012323596536257940865191759958191141927469705717229297160293645616965252935768838221069724045314321468122778102190272203721595427118234293979687595632013680647352722589129686173006256611741794504701897170430155303809328057620955332830967596645368594105246945340269177608454700950981542453098799391204902996079682585726077788735323172833669157208933105328320688115165403826545598927201627249410032419171147416036060482494310313973399963662345404911693098014230729136599941932163456611595895059104775163455217728743575034276058374708178334997147073744767691582680892897199796122494961096167960722019157173361146936811991971390168385637304432676953904476762445279910913171572513177072541852580653529021831314795629186219681562085784871790357946471666771284027378207178520108478298275531913586518715536383856596319509987179659668437785231444827668882063238119727411375182795461735962704177295871116919234266198086260511993082345239690462198949212239357280276703513750501938682329025159521973018772292717925652964949167, 313721)]

当我增加limit时,我能够找到第四个例子,其中有问题的素数为3523969。这些对的索引序列在整数序列的在线百科全书中是A075702。该参考文献并未指出该序列是否为无穷大。

相关问题