2

我有以下伪代码:

for j = 0 to argmax {l where t mod 2^l = 0} do

t 是在此 for 循环之外递增的计数器。我的问题是如何评估 argmax 语句?

在此处输入图像描述

我相信代码中的“我”是一个错字。't' 可能是正确的。

4

3 回答 3

3

没有封闭形式的argmax功能。

Argmax 表示找到使函数最大化的参数(参数)。

如果语句中有复杂的表达式,则可以任意复杂。

在这里,它可能可以实现为单行数学表达式,由于行长,作者懒得拼写。否则,如果您有一个有限整数域,则可以使用循环来实现它:

def argmaximod2l(maxl, i):
  for l in range(maxl, 0, -1):
    if i % (2**l) == 0: return l
  raise Exception("No l was divisible by i.")

如果你有两个整数,你可以使用嵌套循环;如果你的参数加倍并且你有一个平滑的凸函数,你可以使用梯度下降方法。

在这种特殊情况下,最大值l应该是 的尾随零的数量i。有更有效的方法(也可能有一个库函数,例如Long.numberOfLeadingZeros在 Java 中)可用。

在这种特殊情况下,您可能希望将循环实现为:

for (int j=0, i=t; (i&1)==0; j++, i>>>=1) {
  ...
}
于 2013-10-11T07:33:05.907 回答
1

不太确定我是否了解您的问题的要点?

for (int j = 0; j < argmax; j++) {...}

所以 argmax 是一个函数,那么

for (int j = 0; j < argmax(); j++) {...}

private int argmax () {return some int}
于 2013-10-11T02:05:02.927 回答
1

与其将 argmax 实现为函数,甚至直接计算 argmax,我认为这样做会更简单:

int j=0;
for(int s=t*2; s%2==0; s/=2){
  // loop code goes here
  j++;
}
于 2013-10-11T02:43:17.167 回答