- 主题:如何加快运算速度?请指教
【 在 feng321 的大作中提到: 】
: 素数是固定集合。大数乘法 在python 里直接相乘,python自动处理了。感觉算乘积、再判断是否整除,都不耗时间,关键是3重、5重循环耗时间。
三重就是指数关系啊
1000一重算一千次
两重就算100万次
三重就是10亿次,五重就是天文数字。
当然耗时间了,哪怕算一千次千分之一秒, 累计时间也很可观。
--
FROM 124.126.0.*
【 在 feng321 的大作中提到: 】
: 谢谢回复,我们可以假设这个素数列表是递增不重复的。这样程序就可以不考虑重复的情况了。
: “判断规则加上p-1整除N-1则在x,y,z不相同不能成立(找不大)”————这句话什么意思?满足p|N,(p-1)|(N-1),(p+1)|(N+1) 的素数,找不到?不可能的!我已经找到一个了,并且发给了iMx
: 好奇,您是怎么用gpu运算的啊?代码看不出你是用gpu运算啊
三个质数不相同的话, 程序没有返回没有找到结果,再大的指数, 三个相乘也超出32位整数范围了,
除非程序实现长整数乘法加法器,不过,我没数学证明过
--
FROM 124.126.0.*
是指数。但取的数,各不相同,实际上是组合数C(n,3)
【 在 poggy 的大作中提到: 】
:
: 三重就是指数关系啊
: 1000一重算一千次
: ...................
--
FROM 120.242.253.*
python可以直接计算大整数乘积,上万位都没问题。我好奇你的代码是如何利用Gpu算的?
【 在 poggy 的大作中提到: 】
:
: 三个质数不相同的话, 程序没有返回没有找到结果,再大的指数, 三个相乘也超出32位整数范围了,
: 除非程序实现长整数乘法加法器,不过,我没数学证明过
--
FROM 120.242.253.*
这是在做题吗?
应该不是完全暴力解法。应该也不用大整数。目测某种形式的筛法可做。
数学题还是要数学法做。
【 在 feng321 (sfdf) 的大作中提到: 】
: 发信人: feng321 (sfdf), 信区: Python
: 标 题: 如何加快运算速度?请指教
: 发信站: 水木社区 (Sat Mar 4 12:53:48 2023), 转信
:
--
FROM 124.217.189.*
【 在 feng321 的大作中提到: 】
: python可以直接计算大整数乘积,上万位都没问题。我好奇你的代码是如何利用Gpu算的?
这个很简单, 首先,需要一块计算显卡,一般用Nvidia的容易些, 安装好专用驱动和CUDA库,
python端, 选择一种支持显卡计算的python库, 比如numba, 或者cupy之类的
一般安装tenorflow或者pytorch做深度学习计算也都会需要这些步骤。
这里用的numba的cuda
一个生成素数的程序,从1000开始,搜索24000个整数:
from numba import cuda
import numpy as np
import math
from time import time
@cuda.jit
def gpu_prime_gen(a, b, result, n):
idx = cuda.threadIdx.x + cuda.blockDim.x * cuda.blockIdx.x
if idx < n :
if(b[idx]%2==0):
result[idx] = 0
else:
result[idx] = 3
while(result[idx]*result[idx] <= a[idx]):
if((b[idx] % result[idx]) == 0):
result[idx] = 0
break
else:
result[idx] += 2
else:
result[idx] = b[idx]
def main():
n = 8000
x = np.arange(1000,1000+n*3).astype(np.int32)
y = x+1
start = time()
x_device = cuda.to_device(x)
y_device = cuda.to_device(y)
out_device = cuda.device_array(n*3)
threads_per_block = 1024
blocks_per_grid = math.ceil(n*3 / threads_per_block)
# 使用默认流
gpu_prime_gen[blocks_per_grid, threads_per_block](x_device, y_device, out_device, n*3)
gpu_result = out_device.copy_to_host()
cuda.synchronize()
gpu_result = gpu_result[gpu_result>0]
print("gpu vector gpu_prime_gen time " + str(time() - start)+" got prime "+ str(len(gpu_result)))
print(gpu_result[:1024].astype(np.int32))
if __name__ == "__main__":
main()
--
修改:poggy FROM 124.126.0.*
FROM 124.126.0.*
这是什么语法? else不是跟if一块用吗?这样用也可以?
【 在 poggy 的大作中提到: 】
:
: 这个很简单, 首先,需要一块计算显卡,一般用Nvidia的容易些, 安装好专用驱动和CUDA库,
: python端, 选择一种支持显卡计算的python库, 比如numba, 或者cupy之类的
: ...................
![单击此查看原图](//static.mysmth.net/nForum/att/Python/167392/499/middle)
--
FROM 120.242.253.*
【 在 feng321 的大作中提到: 】
: 这是什么语法? else不是跟if一块用吗?这样用也可以?
: [upload=1][/upload]
建议好好学学python基础, 别整什么并行计算, GPU运算这些,
我感觉你的基础还需要加强, 是不是个学生, 慢慢来, 不能急于求成。
--
FROM 124.126.0.*
假设三个素数是a、b、c,你的要求是abc+1整除a+1且abc-1整除a-1。
abc+1 = (a+1)bc-bc+1 => bc-1整除a+1
abc-1 = (a-1)bc+bc-1 => bc-1整除a-1
一般a是奇数,a+1 = 2t+2,a-1 = 2t,那么bc-1同时整除2(t+1)和2t,所以bc-1 = 2kt(t+1)。
所以你应该第一层循环a遍历列表中所有质数,那么t就可以确定。之后再用bc-1 = 2kt(t+1),b遍历比sqrt(2kt(t+1)+1)大的质数,再来判断有没有c满足条件。这么应该比你三层循环要快点。
【 在 feng321 的大作中提到: 】
: 我有1029个不相同的素数,然后 要从中取出若干个素数(无重复),把它们乘起来构成一个大整数 N, 要求N的每一个素因子 p 都满足条件
: p-1 整除 N-1,且 p+1 整除 N+1
: (只要计算奇数个素因子的乘积,再验算就行了)
: ...................
--
FROM 166.113.80.*
首先,应该是a+1整除bc-1,你搞反了
其次,你的循环说明我看不懂。开头你已经说了,a,b,c都是素数
【 在 cafitren 的大作中提到: 】
: 假设三个素数是a、b、c,你的要求是abc+1整除a+1且abc-1整除a-1。
: abc+1 = (a+1)bc-bc+1 => bc-1整除a+1
: abc-1 = (a-1)bc+bc-1 => bc-1整除a-1
: ...................
--
FROM 120.242.251.*