我有以下伪代码:
for j = 0 to argmax {l where t mod 2^l = 0} do
t 是在此 for 循环之外递增的计数器。我的问题是如何评估 argmax 语句?
我相信代码中的“我”是一个错字。't' 可能是正确的。
没有封闭形式的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) {
...
}
不太确定我是否了解您的问题的要点?
for (int j = 0; j < argmax; j++) {...}
所以 argmax 是一个函数,那么
for (int j = 0; j < argmax(); j++) {...}
private int argmax () {return some int}
与其将 argmax 实现为函数,甚至直接计算 argmax,我认为这样做会更简单:
int j=0;
for(int s=t*2; s%2==0; s/=2){
// loop code goes here
j++;
}