首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python aks素性测试转译为JavaScript

将Python aks素性测试转译为JavaScript
EN

Stack Overflow用户
提问于 2014-04-22 09:08:18
回答 2查看 219关注 0票数 0

我正在反编译这段Python代码:

代码语言:javascript
复制
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。以下是我到目前为止所做的工作:

代码语言: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:

代码语言:javascript
复制
return not any(mult % p for mult in ex[0:-1])

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-04-22 09:11:44

您的any的JavaScript实现将不适用于数组。您最好使用Array.prototype.some (对于Python的all,使用Array.prototype.every )。

由于我们没有生成器表达式,在JavaScript中,您可以这样做

代码语言:javascript
复制
return ex.slice(0, -1).some(function(currentItem) {
    currentItem % p;
});

我们对数组执行slice操作,这样就可以排除最后一个元素。

票数 0
EN

Stack Overflow用户

发布于 2014-04-22 10:11:39

首先,定义一个模函数,以与Python中相同的方式执行make sure the modulo behaves

代码语言:javascript
复制
function modulo(a, b) {
    return ((a % b) + b) % b;
}

'not any‘行实际上只是表示,如果模的所有迭代都没有得到0的结果,那么你想要返回true。您不能在JS中执行列表理解,但您可以通过执行以下操作来获得相同的结果。

代码语言:javascript
复制
// 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循环变得更简单:

代码语言:javascript
复制
for (var i = 0; i < ex.length - 1; i++) {
  if (modulo(ex[i], p) === 0) {
    return false;
  }
}
return true;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23208656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档