【问题标题】:How to use polynomials instead of bits to improve the performance?如何使用多项式而不是位来提高性能?
【发布时间】:2011-12-17 20:36:32
【问题描述】:

我有一个 128 位的字符串,我的主管要求我将这 128 位表示为多项式。这是他正在写的论文的扫描图:

他的想法是,由于我们从这些位中消除了 0,我们将能够比处理所有位更快地执行下一个操作(其中大部分是位/多项式之间的 XOR)。

我了解要求是什么,我可以在纸上完成,也可以在申请中完成。但是我的方式不会达到他的目标,即提高性能。他实际上说已经有图书馆可以做到这一点,但不幸的是我找不到。我发现的唯一东西是一个计算多项式的多项式类,这不是我想要的。

那么你们知道我该如何实现它来提高性能吗?非常感谢任何代码/sn-ps/文章。

应用程序是用 Java 编写的,如果这有什么不同的话。

谢谢,

莫塔

更新:

我的主管说这个C library 将完成这项任务。我无法弄清楚它是如何工作的以及它将如何做到这一点。

【问题讨论】:

  • 我已经在加密库中看到过这种做法,尤其是 galois 领域。我无法比这更具体,我已经有一段时间没有看到它了。
  • 问题是大多数机器处理比特的速度非常快,如果你尝试做其他事情(例如 *、+、/),它仍然必须使用比特。如果在所有原因中使用多项式都更快,您可以采用解决方案,将其分解为位,然后多项式,并使其在每次迭代中变得更快(相反我怀疑每次都会变慢) 可能在某些情况下他的建议是更快,但我想不出。

标签: java performance polynomial-math


【解决方案1】:

您的主管是否熟悉BitSet? 128 位是 16 个字节,可以存储为 2longs。但是,使用 BitSet,您无需担心处理 2 个longs 的组合。 BitSet 还为所有常见的位操作提供了方法。我认为您很难找到比这更好的解决方案。

多项式方法是一个很酷的想法,但我认为它的理论性大于实用性。

【讨论】:

    【解决方案2】:

    他提出的是一个Monomial,你可以将它组合成Polynomial——想想复合模式。定义所有常用的数学运算(加法、减法、乘法、除法)和您认为可能需要的任何其他运算(例如微分和积分)。

    多项式对于x^1000 + 1 这样的情况非常适用,因为您可以只用两项来捕获它。

    真正的问题是:你的老板认为你在节省什么?几位?速度?开发时间?我同意 ziesemer 的观点——你很难比BitSet 做得更好。她/他考虑的节省对我来说似乎是一种微优化,如果您分析您的应用程序就不会出现这种情况。

    但她/他老板......值得争论吗?

    也许您可以将这些细节抽象出来并分析两者。

    【讨论】:

      【解决方案3】:

      如果您有多个需要 XOR 的字符串,它实际上会导致性能开销。这是因为您需要匹配权重。

      这完全取决于你用什么进行异或运算,以及你必须这样做多少次才能计算出采用这种方法的优势。

      我会选择 ziesemer 的解决方案。

      【讨论】:

        【解决方案4】:

        我非常怀疑您是否会在 128 位字符串上获得任何好处。 128 位是 16 个字节;任何对象都至少需要 40,因此(几乎)任何支持结构都将比它存储的数据更昂贵。

        不过,这里是现有方法的a good survey,还有一种新颖的方法,它可能(或可能不会)对您有益。并不是说它是对您问题的回答,并且同意 ziesemer 的解决方案对于如此庞大的数字是最好的,但是如果您想拓宽视野,请看一下。

        【讨论】:

          猜你喜欢
          • 2023-03-28
          • 2011-08-24
          • 1970-01-01
          • 2013-01-26
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多