我正在反编译这段Python代码:
def expand_x_1(p):
ex = [1]
for i in range(p):
ex.append(ex[-1] * -(p-i) / (i+1))
return ex[::-1]
def aks_test(p):
if p < 2: return False
ex = expand_x_1(p)
ex[0] += 1
return not any(mult % p for mult in ex[0:-1])
for p in range(101):
if aks_test(p):
print(p)进入JavaScript。以下是我到目前为止所做的工作:
function expand_x_1(p){
var ex = [1];
for(i = 0; i < p; i++){
ex.push(ex[ex.length - 2] * -(p-i) / (i+1));
}
return ex.reverse();
}
function aks_test(p){
if(p < 2)
return false;
var ex = expand_x_1(p);
ex[0] += 1;
// the return part right here is what I need help with.
}
// Python equivalent of any()
function any(iterable){
for(element in iterable)
if(element)
return true;
return false;
}我只需要帮助将这行Python代码转换为JavaScript:
return not any(mult % p for mult in ex[0:-1])谢谢!
发布于 2014-04-22 09:11:44
您的any的JavaScript实现将不适用于数组。您最好使用Array.prototype.some (对于Python的all,使用Array.prototype.every )。
由于我们没有生成器表达式,在JavaScript中,您可以这样做
return ex.slice(0, -1).some(function(currentItem) {
currentItem % p;
});我们对数组执行slice操作,这样就可以排除最后一个元素。
发布于 2014-04-22 10:11:39
首先,定义一个模函数,以与Python中相同的方式执行make sure the modulo behaves:
function modulo(a, b) {
return ((a % b) + b) % b;
}'not any‘行实际上只是表示,如果模的所有迭代都没有得到0的结果,那么你想要返回true。您不能在JS中执行列表理解,但您可以通过执行以下操作来获得相同的结果。
// just use length-1 instead of slicing array
for (var i = 0; i < ex.length - 1; i++) {
var mult = ex[i];
// modulo mult by p
var test = modulo(mult, p);
// return false if any modulo result is 0
if (test === 0) {
return false;
}
}
// will only make it this far if all modulos !== 0
return true;-编辑--
我只是为了让它更容易理解而扩展了它,你可以让for循环变得更简单:
for (var i = 0; i < ex.length - 1; i++) {
if (modulo(ex[i], p) === 0) {
return false;
}
}
return true;https://stackoverflow.com/questions/23208656
复制相似问题