对数步计算斐波那契数列

先上代码:

def fib_iter(a, b, p, q, n):
    if n==0:
        return b
    if n%2 == 0:
        return fib_iter(a,b,
                p*p+q*q,
                2*p*q+q*q,
                n/2)

    return fib_iter(a*p+a*q+b*q,
            b*p + a*q,
            p,
            q,
            n-1)

def fib(n):
    return fib_iter(1, 0, 0, 1, n)

a <- a+b, b <- a被称为T变换, T pq 变换 a <- a*p + a* q + b*q, b <- b*p + a*q, 所以T变换是 T pq 变换 q=1 p=0的特例,

Tpq 变换有个特性是 Tpq 的二次方等于Tp‘q’, p‘ = p*p + q*q , q' = 2*p*q + q*q

虽然我知道了这个变换,但怎么证明还是不会,数学差的人伤不起 

#########################################################################################

费马小定理证明素数性, 不知道为什么,性能竟然比连续求模差

from random import randint
import time

def expmod(a , n, m):
    if n == 0:
        return 1
    if n%2 == 0:
        return pow(expmod(a, n/2, m), 2)%m
    else:
        return (expmod(a, n-1, m) * a )%m

def judgeprime(m, time):
    for x in range(time):
        a = randint(2, m-1)
        if expmod(a, m, m) != a:
            return False
    return True

t1 = time.time()
x1 = [ x for x in xrange(1000000, 10000001) if judgeprime(x, 5)]
print time.time()-t1

def isPrime(num):  
    i = 2  
    isPrime = True  
    while(i*i <= num):  
        if(num % i == 0):  
            isPrime = False  
            break  
        else:  
            i += 1  
    return isPrime  

t3 = time.time()
x2 = [ i for i in xrange(1000000, 10000001) if isPrime(i)] 
print time.time() -t3


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值