乘法链导致常数模2的幂

时间:2008-11-01 04:23:13

标签: algorithm language-agnostic math puzzle

是否有一种实用的算法可以提供“乘法链”

澄清一下,目标是产生任意和精确长度的乘法变化
长度为1的乘法链是微不足道的。

“乘法链”将被定义为代码中使用的2个数字{start}和{multiplier}:

 Given a pointer to array of size [{count}]   // count is a parameter
 a = start;
 do 
 {
      a = a * multiplier;  // Really: a = (a * multiplier) MOD (power of 2
      *(pointer++) = a;   
 }
 while (a != {constant} )
 // Postcondition:  all {count} entries are filled.  

我想找一个带三个参数的例程      1. 2的力量      2.停止{常数}
     3. {count} - 循环迭代的次数

例程将返回{start}和{multiplier}。

理想情况下,{Constant}值为0应该有效。

琐碎的例子:

power of 2 = 256  
stopping constant = 7
number of times for the loop = 1  
returns {7,1} 

非常重要的例子:

power of 2 = 256  
stopping constant = 1
number of times for the loop = 49
returns {25, 19}  

给定功率2的最大{count}可能相当小     例如,2 ^ 4(16)似乎被限制为4

的计数

3 个答案:

答案 0 :(得分:5)

您要求对以下模块化方程式进行重要解决方案:

s * m^N = C (mod 2^D)

,其中

  • s是起始常数
  • m是乘数
  • N是迭代次数(由问题给出)
  • C是最终常数(由问题给出)
  • D是2的幂的指数(由问题给出)

在数论中查看Euler's theorem

对于任意奇数 m(其为2 ^ D的素数),你有

m^phi(2^D) = 1 (mod 2^D)

从而

C * m^phi(2^D) = C (mod 2^D)

最后

C * m^(phi(2^D)-N) * m^N = C (mod 2^D)

s = C * m^(phi(2^D)-N)

你已经完成了。 2的幂Euler's phi function half 2的幂,即:

phi(2^D) = 2^(D-1)

示例即可。让

  • N = 5
  • C = 3
  • 2 ^ D = 16
  • phi(16)= 8

任意选择m = 7(奇数),并计算

3 * 7^(8-5) = 1029
s = 1029 mod 16 = 5

现在

s * m^N = 5 * 7^5 = 84035
84035 mod 16 = 3 == C

答案 1 :(得分:2)

这是一种计算常量为奇数时的起始和乘数值的方法:

  1. 找到m个模2 ^ D的阶数至少为count的奇数m(m =乘数),意味着最小n使得m ^ n = 1(mod 2 ^ D)至少是count。我不知道找到这样的m的任何其他方式比进行随机猜测,但是从一点点实验看来,在1和2 ^ D之间的一半奇数似乎具有最大的阶数2 ^(D-2)。 (我最多12次尝试D。)

  2. 计算x使得x * m ^ count = 1(mod 2 ^ D)并设置start = x * constant(mod 2 ^ D)。

  3. 这样的x可以用“扩展的欧几里得算法”找到:给定a和b没有公约数,它给出x和y使得a * x + b * y = 1.这里a = m ^ count mod 2 ^ D和b = 2 ^ D。

    编辑:如果常量是偶数,你可以用2的幂除以2 ^ k来制作奇数,然后输入上面的输入{constant / 2 ^ k,count,2 ^(Dk)},最后返回{start * 2 ^ k,multiplier}。

答案 2 :(得分:1)

为什么这不符合要求?

start = constant;
multiplier = 1;

更新:我现在看到循环数是输入参数之一。听起来这个问题是discrete logarithm问题的特殊情况,或者至少与{{3}}问题有关。