优化整数系数列表与其长整数表示之间的转换

2024-02-20

我正在尝试优化我的多项式实现。特别是我正在处理系数模的多项式n(可能>2^64) 并对以下形式的多项式取模x^r - 1(r is < 2^64)。目前,我将系数表示为整数列表(*),并且我已经以最直接的方式实现了所有基本操作。

我希望求幂和乘法尽可能快,为了实现这一点,我已经尝试了不同的方法。我当前的方法是将系数列表转换为大整数,将整数相乘并解压缩系数。

问题是装箱和拆箱需要花费大量时间。

那么,有没有办法改进我的“打包/解包”功能呢?

def _coefs_to_long(coefs, window):
    '''Given a sequence of coefficients *coefs* and the *window* size return a
    long-integer representation of these coefficients.
    '''

    res = 0
    adder = 0
    for k in coefs:
        res += k << adder
        adder += window
    return res
    #for k in reversed(coefs): res = (res << window) + k is slower


def _long_to_coefs(long_repr, window, n):
    '''Given a long-integer representing coefficients of size *window*, return
    the list of coefficients modulo *n*.
    '''

    mask = 2**window - 1
    coefs = [0] * (long_repr.bit_length() // window + 1)
    for i in xrange(len(coefs)):
        coefs[i] = (long_repr & mask) % n
        long_repr >>= window

    # assure that the returned list is never empty, and hasn't got an extra 0.
    if not coefs:
        coefs.append(0)
    elif not coefs[-1] and len(coefs) > 1:
        coefs.pop()

    return coefs

请注意,我这样做not choose n,它是来自用户的输入,我的程序想要证明它的素数(使用AKS测试),所以我不能分解它。


(*)我尝试了几种方法:

  1. Using a numpy数组而不是列表并使用相乘numpy.convolve。速度很快n < 2^64但非常慢n > 2^64[我也想避免使用外部库]
  2. Using scipy.fftconvolve。根本不起作用n > 2^64.
  3. 从一开始就将系数表示为整数(无需每次都进行转换)。问题是我不知道有什么简单的方法可以做到这一点mod x^r -1操作而不将整数转换为系数列表(这违背了使用这种表示形式的原因)。

除非你这样做是为了学习,否则为什么要重新发明轮子呢?另一种方法是为其他多项式库或程序编写一个 Python 包装器(如果这样的包装器尚不存在)。

尝试 PARI/GP。速度快得惊人。我最近编写了一个自定义 C 代码,花了我两天的时间来编写,结果只比两行 PARI/GP 脚本快 3 倍。我敢打赌,调用 PARI 的 Python 代码最终会比单独用 Python 实现的任何代码都要快。甚至还有一个用于从 python 调用 PARI 的模块:https://code.google.com/p/pari-python/ https://code.google.com/p/pari-python/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化整数系数列表与其长整数表示之间的转换 的相关文章

随机推荐

  • 从方法链中使用的临时移出

    我正在尝试做类似的事情 include
  • 是否存在空 URI?

    我正在开发一个解析 URI 的例程 在明显的情况下 有一个空字符串的情况 空字符串是有效输入吗 空字符串的结果 URI 会是什么 空字符串不可能是 URI 这通用 URI 语法 https www rfc editor org rfc rf
  • 防止周末和节假日期间发出 Grafana 警报

    背景 我们正在使用 Grafana 警报 在周末和节假日期间 我们的一些指标会较低 但这实际上没关系 但仅限于那些日子 Problem 在周末和节假日期间 即使系统实际上没问题 我们也会收到来自 Grafana 的警报 Question 我
  • Genshin - 如何打印范围内的所有变量

    很简单 我想打印出 genshi 模板范围内的所有变量 作为调试和发现措施 有办法做到吗 标准Python函数locals http docs python org library functions html locals 返回一个字典
  • 如何从 matplotlib 获取 AxesImages

    所有 我使用这样的代码来绘制图像 import matplotlib pyplot as plt plt imshow array cmap jet plt show 但是 现在我想得到句柄 im of im plt imshow arra
  • 应该学习没有 jQuery 的 angularjs 吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是客户端 JavaScript 的新手 在一个网络项目中 我发现了 AngularJS 并使用了一些基础知识 我应该学习 jQuery 还是只
  • laravel nova 隐藏索引页面上的编辑按钮

    如何禁用 nova 索引页面上的编辑 删除按钮并仍然允许在详细信息页面中 如果我将创建一个策略 这将禁用到处的操作 我想允许在详细信息页面中编辑和删除 但只想删除这些按钮从索引 正在做类似的事情 public function update
  • 使用 rvest 抓取时,在缺失值的地方输入 NA

    我想用rvest抓取一个页面 其中包含最近一次会议上演讲的标题和运行时间 然后将这些值组合成一个tibble library tibble library rvest url lt https channel9 msdn com Event
  • 使用动态类型从匿名对象获取值是不好的做法吗?

    注意 我的问题与 ASP Net 无关 我有一个使用 LINQ 与匿名集合绑定的 GridView 我希望在网格中的事件处理程序中从绑定对象获取一个值 该对象无法转换为任何静态类型 因为它的类型是匿名的 为了解决这个问题我使用动态类型来获取
  • Android - 使用意图从手机内存中打开文件

    我正在开发一个应用程序 它将手机中的 txt 文件作为输入并将其打印在 TextView 上 public class MainActivity extends AppCompatActivity Button button Intent
  • Android中位图压缩后如何保存Exif数据

    我需要从 SD 卡获取图像 创建 旋转并保存更改后的图像 我尝试使用这段代码 Bitmap original BitmapFactory decodeFile file getAbsolutePath ExifInterface origi
  • 如何在具有融化数据的 ggplot 中缩放密度图(对于多个变量)

    我有一个融化的数据集 其中还包括从正态分布生成的数据 我想根据正态分布绘制数据的经验密度函数 但生成的两个密度图的比例不同 我可以找到两个单独数据集的这篇文章 标准化 ggplot 中叠加密度图的 x 尺度 https stackoverf
  • 如何让活动指示器等待函数

    我想使用活动指示器来显示我的函数正在加载 它运行得如此之快 我可以看到我的活动指示器 但该功能尚未完成加载 问题 当函数真正完成运行时 如何使用使我的活动指示器为 false 这是我的代码 public MainPage Initializ
  • 如何清除Docker任务历史记录

    当以 Swarm 模式运行 docker 时 过去任务的历史记录会随着 docker 服务的更新而累积 跑步docker node ps显示任务日志 如何在不删除服务的情况下清除此日志 您可以通过运行以下命令来调整 swarm 中的历史记录
  • IE9拒绝加载自定义字体?

    我正在尝试让 IE9 显示自定义字体 应该很容易 研究了大量的谷歌网站 甚至 stackoverflow 问题 这就是我所拥有的 font face font family BrushstrokePlain src url fonts BR
  • 了解 git rev-list

    在寻找 git hook 示例时 我遇到了以下帖子 https github com Movidone git hooks blob master pre receive https github com Movidone git hook
  • Stackdriver 监控图表的算术运算

    我正在尝试为我的服务提供的自定义指标设置 Stackdriver 仪表板 特别是我从一般开始custom grpc time ms指标是一个量规并且有status上面有标签 我希望能够设置一个图表并针对指标的成功率发出警报 类似于count
  • Azure AppInsights - Http 结果代码故障

    我们已经在Azure中配置了API WebApp 然后连接了App Insights Log以获取失败时的详细信息 我们正在 APIM 上进行负载测试 有一次 我们开始收到 500 错误代码 这意味着应用程序级别存在问题 当我们查看详细信息
  • 何时使用 C++forward_list

    我对 C 有点陌生 正在阅读 C 编程语言 第 4 版 一书 在阅读 STL Containers 章节时 书中对forward list有介绍 forward list 单链表 基本上是一个优化的列表 对于空的和非常短的列表 空的forw
  • 优化整数系数列表与其长整数表示之间的转换

    我正在尝试优化我的多项式实现 特别是我正在处理系数模的多项式n 可能 gt 2 64 并对以下形式的多项式取模x r 1 r is lt 2 64 目前 我将系数表示为整数列表 并且我已经以最直接的方式实现了所有基本操作 我希望求幂和乘法尽