數論概論中的費馬降階法求一個質數分解成2個數的平方和與窮舉法的效率比較
原始碼改寫自《HDU 3542 (費馬降階法)》原文連結:https://blog.csdn.net/Feynman1999/article/details/81903899
import random as rd
import time
def ran(n):
if (n%4!=1):return 0
while True:
a=rd.randint(1,10**16)%(n-1)+1 #1~ n-1
b=pow(a,(n-1)//4,n);
if(b*b%n==n-1):
if b<=(n-1)/2 :return b
else: return n-b
def solve(p):
if(p==2): return [1,1];
if(p%4!=1): return mp[-1,-1];
A=ran(p); B=1
tmp=1;
M=(tmp*A*A+tmp*B*B)//p
while M>1:
u=(A%M+M)%M;v=(B%M+M)%M
if(2*u>M): u-=M
if(2*v>M): v-=M
ta=A
A=(tmp*u*A+tmp*v*B)//M
B=(tmp*v*ta-tmp*u*B)//M
M=(tmp*u*u+tmp*v*v)//M
return [min(abs(A),abs(B)),max(abs(A),abs(B))]
def prime(n):
sieve = [True] * (n//2+1)
for number in range(3, int(n ** 0.5) + 1,2):
if sieve[(number-1)//2]:
for index in range(number * number, n, number*2):
sieve[(index-1)//2] = False
return [x for x in range(1,n,2) if sieve[(x-1)//2]]
def test(n):
s=0
p=[i for i in prime(n) if i%4==1 and i>1]
for i in p:
pr=solve(i)
s+=pr[0]+pr[1]
return s
def test2(n):
s=0
p=[i for i in prime(n) if i%4==1 and i>1]
for i in p:
ii=i*i
for x in range(1,int(((i/2)**0.5))+1):
y0=(i -x*x)**0.5
if y0%1==0:s+=(x+int(y0));break
return s
t=time.time();print(test(10**6));print(time.time()-t)
t=time.time();print(test2(10**6));print(time.time()-t)
>>>
>>> t=time.time();print(test(10**6));print(time.time()-t)
32266295
2.1802237033843994
>>> t=time.time();print(test2(10**6));print(time.time()-t)
32266295
9.938273668289185
>>> t=time.time();print(test(10**7));print(time.time()-t)
869849116
21.672968864440918
>>> t=time.time();print(test2(10**7));print(time.time()-t)
869849116
263.66866731643677
相關文章
- 【數論】素數篩法
- 數論——質數與約數
- 篩選法求質數
- 數論學習筆記 (2):質數筆記
- 用一個巨集實現求兩個數中的最大數
- [BZOJ3601]一個人的數論-題解
- 個人比較反感的一些寫法
- C# 輸入一個整數,求質因數C#
- C語言學習 兩個數的平方和C語言
- 求三個數的最小公倍數
- [SDOI2015]約數個數和-[BZOJ4176]Lucas的數論-題解
- 輸出一個區間內的質數(素數)
- Just for fun——分解一個正整數的質因數
- 討論免費OA系統哪個比較好
- 數論基礎——求導求導
- Python求一個數的平方根Python
- 求完全數個數
- 數論——數論分塊
- 浮點數的比較
- 【進階】數論函式求和(理論)函式
- 不用做任何比較判斷運算子找出兩個整數中的較大的值
- 求 10 個整數中的最大值
- 求區間不同數的個數【主席樹求解】
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- C++與Rust變數宣告的比較C++Rust變數
- 求下一個大數
- mysql 求分組中位數、環比、同比、中位數的環比、同比MySql
- 判斷一個數為哪些數的階乘之和(貪心)
- 求兩個整數之和——一個寫註釋的新手
- Some 困難的數論
- 轉載:求任意2個整數互素的概率
- 3069 求n個整數的和
- 求陣列中k個數的所有組合陣列
- 輸入一個整數,返回這個整數的位數
- 數論
- python將輸入的一個正整數分解質因數(map)Python
- 請求引數為物件,mybatis的sql寫法物件MyBatisSQL
- 用牛頓法求正數的開方值