程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么我的 aks prime test 的实现比我的 naive 版本的实现慢??

开发过程中遇到为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?的解决方法建议,希望对你解决为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?有所启发或帮助;

我尝试比较多种算法以找到“i”下的最大素数。 但是当我测试实现时,“aks”比我的天真实现慢。 我在想 aks 是素性测试的更好实现,我弄错了吗?

 def expand_x_1(n): 
    c =1
    for i in range(n//2+1):
        c = c*(n-i)//(i+1)
        yIEld c
 
def aks(p):
    if p==2:
        return True
 
    for i in expand_x_1(p):
        if i % p:
            return false
    return True

def all_factors(X): # naive version
    i = 2
    s = int(x ** 0.5)
    while i < s:
        if x % i == 0:
            return false
        i += 1
    return True

def find(i,funC) :
    while not func(i) :
        i -= 1
    print(i)

%time find(2**16,aks)
%time find(2**16,all_factors)

我尝试比较两者并获得:

  • 对于 aks
65521
cpu times: user 1.7 s,sys: 3.24 ms,@R_411_10586@l: 1.7 s
Wall time: 1.7 s
65521
cpu times: user 81 µs,sys: 0 ns,@R_411_10586@l: 81 µs
Wall time: 83.9 µs

解决方法

当输入是质数时,using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using FTD2XX_NET; namespace PruebaBarbaro { public partial class Prueba : Form { UInt32 ftdiDeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUs.FT_OK; FTDI myFtdiDevice = new FTDI(); byte[] dato = new byte[1]; byte[] datord = new byte[128]; uint numBytesWritten,numbytesAvailable; UInt32 numbytesRead = 0; public Prueba() { InitializeComponent(); } private void btnConnect_Click(object sender,EventArgs E) { ftStatus = myFtdiDevice.GetnumberOfDevices(ref ftdiDeviceCount); if (ftStatus==FTDI.FT_STATUs.FT_OK) { lblNumDev.Text = ftdiDeviceCount.ToString(); lblNumDev.Visible = true; } else { lblNumDev.Text = "Failed to get number of devices"; lblNumDev.Visible = true; } // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; // Populate our device list ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList); if (ftStatus == FTDI.FT_STATUs.FT_OK) { for (int i = 0; i < ftdiDeviceCount; i++) { if (ftdiDeviceList[i].serialnumber.ToString() == "FTCB4217") { lblDescription.Text = ftdiDeviceList[i].Description.ToString(); lblDescription.Visible = true; ftStatus = myFtdiDevice.openByserialnumber(ftdiDeviceList[i].serialnumber); if (ftStatus != FTDI.FT_STATUs.FT_OK) { lblerror.Text = "Failed to open device"; } } } } ftStatus = myFtdiDevice.SetBaudRate(921600); if (ftStatus != FTDI.FT_STATUs.FT_OK) { lblerror.Text = "Failed to set Baud Rate"; lblerror.Visible = true; } } private void btnTx_Click(object sender,EventArgs E) { dato[0] = 1; ftStatus = myFtdiDevice.Write(dato,1,ref numbytesWritten); if (ftStatus != FTDI.FT_STATUs.FT_OK) { lblerror.Text = "Failed to write to device"; lblerror.Visible = true; } else { lblDataTx.Text = dato[0].ToString(); lblTx.Text = numbytesWritten.ToString(); lblTx.Visible = true; lblDataTx.Visible = true; } do { ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numbytesAvailablE); if (ftStatus != FTDI.FT_STATUs.FT_OK) { lblerror.Text = "Failed to get number of bytes available to read"; lblerror.Visible = true; } } while (numbytesAvailable == 0); lblbytesRx.Text = numbytesAvailable.ToString(); numbytesAvailable = 128; lblbytesRx.Visible = true; ftStatus = myFtdiDevice.Read(datord,128,ref numbytesRead); if(numbytesRead==128) { lblValueRx.Text = datord[0].ToString(); lblValueRx.Visible = true; } } private void btnDisconnect_Click(object sender,EventArgs E) { lblDataTx.Visible = false; lblValueRx.Visible = false; lblbytesRx.Visible = false; lblerror.Visible = false; lblTx.Visible = false; lblDescription.Visible = false; lblNumDev.Visible = false; ftStatus = myFtdiDevice.Close(); } } } 最终会产生所有可能的 expand_x_1(n) 结果,但 n//2+1 中的循环只循环了大约 all_factors(n) 次。这就是一个巨大的差异。

但也很重要:

sqrt(n)

在迭代中无限增长。添加

c = c*(n-i)//(i+1)

print(c.bit_length()) 之前,您会看到 yield 在完成之前正在对超过 65000 位宽的整数进行算术运算。这也比这贵得多 16 位算术 find(65521,aks) 可以。

注意:在实践中,没有人使用 AKS 素性测试,因为即使是由世界级数学家大规模优化的版本也比替代方案慢。有关详情,请参阅 AKS Primes algorithm in Python。

大佬总结

以上是大佬教程为你收集整理的为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?全部内容,希望文章能够帮你解决为什么我的 aks prime test 的实现比我的 naive 版本的实现慢?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。