Algorithm 计算二进制标量积mod 2的最有效方法

Algorithm 计算二进制标量积mod 2的最有效方法,algorithm,optimization,binary-data,Algorithm,Optimization,Binary Data,我目前正在为一些物理问题执行傅里叶变换,我的算法的一个巨大瓶颈来自对模2的标量积的计算 对于给定的整数N,我必须用2^N-1的二进制表示所有的数字 对于以二进制向量表示的这些数字中的每一个(例如,15=2^3+2^2+2+2^0=(1,1,1,1,0,…,0)),我必须用二进制形式的模2计算从0到2^N-1的所有数字的标量积 (例如,标量积1.15=(1,0,0,…,0)。(1,1,1,1,0,…,0)=1*1+1*0+…=1模2) 注意,在模2约化过程中,组件保持为二进制形式 (1,1)。(1

我目前正在为一些物理问题执行傅里叶变换,我的算法的一个巨大瓶颈来自对模2的标量积的计算

对于给定的整数N,我必须用2^N-1的二进制表示所有的数字

对于以二进制向量表示的这些数字中的每一个(例如,15=2^3+2^2+2+2^0=(1,1,1,1,0,…,0)),我必须用二进制形式的模2计算从0到2^N-1的所有数字的标量积

(例如,标量积1.15=(1,0,0,…,0)。(1,1,1,1,0,…,0)=1*1+1*0+…=1模2)

注意,在模2约化过程中,组件保持为二进制形式

(1,1)。(1,1)=1*1+1*1,而不是1*1+2*2

这基本上是2^(2N)个标量积,我必须执行并减少模2

我很难获得N=18以上的数据

我想知道是否可以用一些聪明的数学技巧来大大减少做这些事情的时间

我在考虑某种递归(即,将N的结果保存在文件中,并推断N+1的结果),但我不确定这是否有帮助。事实上,通过这种递归,知道N的结果,我可以切割N+1对应于N部分的向量加上一个额外的数字,但是在每个标量积上,我必须告诉我的计算机去读取一个大文件(因为我可能无法将其全部保存在动态内存中),这可能很耗时,可能比我对每个产品执行的20次乘法还要多

是否有任何已知的优化数论算法允许快速计算模2的标量积?是否有任何规则或想法我不知道,我可以利用


很抱歉,格式太糟糕了,我无法让LateX在这里工作。

相应位的乘积之和,模2,将等于中的1位数和两个数的模2

由于可以轻松获得数字的二进制表示形式,因此可能不需要为它们实际创建位数组,只需在编程语言中使用整数数据类型,它至少允许32位。许多语言提供位运算符,例如AND(
&
)和XOR(
^

可以使用来计算数字中的1位

下面是一个Python程序,它计算2个数的乘积模2:

def numberofsetbit(i):
i=i-((i>>1)和0x5555);
i=(i&0x33333333)+(i>>2&0x33333333);
返回((i+(i>>4))&0x0f0f)*0x01010101)>>24;
def产品(a、b):
返回编号设置(a&b)%2
不必使用numberofsetbit来计算位,您可以使用异或将位折叠在一起,首先是16个最高有效位与16个最低有效位,然后是8个最高有效位与8个最低有效位,直到剩下一位。同样在Python中:

def位奇偶校验(i):
i=(i>>16)^i
i=(i>>8)^i
i=(i>>4)^i
i=(i>>2)^i
i=(i>>1)^i
返回i%2
def产品(a、b):
返回位奇偶校验(a&b)

如果您更改评估这些对的顺序(大小为2n x 2n的矩阵),那么您可以有效地确定评估的每一行中哪些产品-mod-2发生了更改

使用,可以迭代0中的每个值。。。2n-1,按特殊顺序排列,每次只有1位外环值变化。您可以为0中的每个值存储1位。。。2n-1表示前一行的product-mod-2值,然后根据更改的位是否有任何影响对其进行更改,仅当另一个(内环)数中的对应位为1时才会进行更改(如果为0,则表示二进制,无论另一位的值是什么,都将为0)

在C中:

int N=5;
int max=(1>1);
int changed_bit=灰色^prev_灰色;

对于(int b=0;b>3)^=(1>3)&(1),您可以只计算两个数字的奇偶性,然后检查奇偶性(看看奇偶性)。如何使用它们,也许也可以减少评估的数量?您是否只需要高层建议,还是还需要针对特定体系结构的实现策略(哪种?)?顺便说一句,SO上没有启用Latex。你对N有一个最大值吗?@harold我用k=I*pi乘以一个二元向量N来计算ikr的c_k乘以指数,而r也是一个二元向量,所以对N.r进行计算可以让我知道我是应该在傅里叶求和中减去还是添加一些项,求和超过k,我想要它对所有r进行计算。c_k是v我不知道“高级”是什么意思,但我最感兴趣的是降低复杂性,而不是在语法上做一些小的改变来加快它(因为我很确定在这种情况下的改进将是……嗯……小的)@trincot我在理想情况下试图达到N=24左右。我怀疑希望更多是不现实的抱歉,我想我不够清楚,我将进一步编辑:mod 2适用于以二进制形式保存的组件的总和!(即15.5=(1,1,1,1,1,0,…)(1,1,0,…)=1+1=2=0 mod 2)你能写出一个完整的“乘积”吗(这显然是一个和)?为什么是1+1?我试图实现的是一个标量积,向量是从正则整数中获得的。例如,对于15,我得到(1,1,1,0…),就是这样。我从不改回十进制。然后我使用通常的点积规则x1*x1+x2*x2+…始终使用x1,x2,…=0或1,然后我减少模2,所以1.15=1*1+0*1+0*1+0+0*0+…+0*0=1=1模2@dfri,N表示位数。无论如何,我刚刚修改了我的答案,以处理这个问题中明确的乘积定义。@tr我不得不再读两遍这个问题,现在才意识到这个事实,谢谢。