R-莱曼素性测试中的模数警告

2024-02-27

我花了一点时间破解莱曼素性测试的 R 实现。我借鉴的功能设计http://davidkendal.net/articles/2011/12/lehmann-primality-test http://davidkendal.net/articles/2011/12/lehmann-primality-test

这是我的代码:

primeTest <- function(n, iter){
  a <- sample(1:(n-1), 1)
    lehmannTest <- function(y, tries){
    x <- ((y^((n-1)/2)) %% n)
    if (tries == 0) {
      return(TRUE)
            }else{          
      if ((x == 1) | (x == (-1 %% n))){
        lehmannTest(sample(1:(n-1), 1), (tries-1))
      }else{
    return(FALSE)
      }
    }
  }
  lehmannTest(a, iter)
}

primeTest(4, 50) # false
primeTest(3, 50) # true
primeTest(10, 50)# false
primeTest(97, 50) # gives false # SHOULD BE TRUE !!!! WTF

prime_test<-c(2,3,5,7,11,13,17 ,19,23,29,31,37)

for (i in 1:length(prime_test)) {
  print(primeTest(prime_test[i], 50))
}

对于小质数,它可以工作,但一旦我达到约 30,我就会收到一条看起来很糟糕的消息,并且该函数将停止正常工作:

2: In lehmannTest(a, iter) : probable complete loss of accuracy in modulus

经过一番调查后,我认为这与浮点转换有关。非常大的数字会被四舍五入,因此 mod 函数会给出不好的响应。

现在问题来了。

  1. 这是浮点问题吗?或者在我的实施中?
  2. 是否有纯粹的 R 解决方案,或者 R 只是在这方面表现不佳?

Thanks

解决方案:

经过良好的反馈和一个小时的有关模幂算法的阅读后,我有了一个解决方案。首先是制作我自己的模幂函数。基本思想是模乘允许您计算中间结果。您可以在每次迭代后计算 mod,因此永远不会得到一个巨大的令人讨厌的数字来淹没 16 位 R int。

modexp<-function(a, b, n){
    r = 1
    for (i in 1:b){
        r = (r*a) %% n
    }
    return(r)
}


primeTest <- function(n, iter){
   a <- sample(1:(n-1), 1)
    lehmannTest <- function(y, tries){
      x <- modexp(y, (n-1)/2, n)   
    if (tries == 0) {
      return(TRUE)
            }else{          
      if ((x == 1) | (x == (-1 %% n))){
        lehmannTest(sample(1:(n-1), 1), (tries-1))
        }else{
        return(FALSE)
         }
    }
  }
   if( n < 2 ){
     return(FALSE)
     }else if (n ==2) {
       return(TRUE)
       } else{
         lehmannTest(a, iter)
         }
}

primeTest(4, 50) # false
primeTest(3, 50) # true
primeTest(10, 50)# false
primeTest(97, 50) # NOW IS TRUE !!!!


prime_test<-c(5,7,11,13,17 ,19,23,29,31,37,1009)

for (i in 1:length(prime_test)) {
  print(primeTest(prime_test[i], 50))
}
#ALL TRUE

当然,表示整数存在一个问题。在 R 中,整数最多可以正确表示 2^53 - 1,大约为 9e15。和这个词y^((n-1)/2)即使对于少数人来说,也很容易超过这个数字。你必须计算(y^((n-1)/2)) %% n通过不断平方y并取模数。这对应于二进制表示(n-1)/2.

即使是“实”数论程序也是这样做的——请参阅维基百科关于“模幂”的条目。尽管如此,应该提到的是,像 R(或 Matlab 和其他数值计算系统)这样的程序可能不是实现数论算法的合适环境,甚至可能不是作为小整数的游戏场。

编辑:原始包不正确 您可以使用“pracma”包中的 modpower() 函数,如下所示:

primeTest <- function(n, iter){
  a <- sample(1:(n-1), 1)
    lehmannTest <- function(y, tries){
    x <- modpower(y, (n-1)/2, n)  # ((y^((n-1)/2)) %% n)
    if (tries == 0) {
      return(TRUE)
            }else{          
      if ((x == 1) | (x == (-1 %% n))){
        lehmannTest(sample(1:(n-1), 1), (tries-1))
      }else{
    return(FALSE)
      }
    }
  }
  lehmannTest(a, iter)
}

以下测试成功,因为 1009 是该集合中唯一的素数:

prime_test <- seq(1001, 1011, by = 2)
for (i in 1:length(prime_test)) {
    print(primeTest(prime_test[i], 50))
}
# FALSE FALSE FALSE FALSE TRUE  FALSE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R-莱曼素性测试中的模数警告 的相关文章

随机推荐

  • 将数值转换为二进制 (0/1)

    我有一个数据框 其中包含不同人的不同种类水果的数量 像下面这样 apple banana orange Tim 3 0 2 Tom 0 1 1 Bob 1 2 2 如何将其转换为二进制矩阵 即如果一个人至少有一个水果 无论他有多少 那么我记
  • 使用 ActiveRecord 连接到 SQL Server

    您是否曾经需要使用 ActiveRecord 连接到 SQL Server 这可能吗 谁能提供一些起点 这是我用的 从这里 http github com rails sqlserver 2000 2005 adapter tree mas
  • 在 R/3.0.2 中安装 minqa 时出错

    我正在安装lme4使用 README md 文件他们的 github 帐户 https github com lme4 lme4我在安装依赖项时失败了 我尝试单独安装它们 但在安装时仍然崩溃minqa包裹 我在 RHEL6 上使用 R 3
  • 数据库插入

    if lines size gt 5 String Actor it next String Bio it next String More Bio it next String Reason it next String Fact it
  • 删除已知提交 ID 的特定提交

    假设我有一个包含以下提交的存储库 git 版本 1 7 1 A gt B gt C gt D gt E我的头在E 现在我想删除 C 同时保持一切相同A gt B gt D gt E 你能帮我看看该怎么做吗 你可以这样做git rebase
  • SOA - 服务应该有多细粒度才能维持性能?

    我正在接手一个项目 从头开始替换一个古老的遗留系统 在我加入之前 该公司聘请了一位顾问 他绘制了系统的基本草图 并大力推行 SOA 这就产生了一长串 实体服务 目的是将它们组成更复杂的服务组合 例如 想要委员会信息的用户可以访问 委员会 服
  • PHP 5.3 + 的 ereg_replace ?

    我已经看到了一个不必重新使用 PHP 5 3 的 ereg 函数的解决方案 PHP 中 eregi 的良好替代方案 https stackoverflow com questions 737198 good alternative to e
  • 如何制作通用类型转换方法

    我想做的是 bool Convert out Object output Object source find type of output convert source to that type if possible store res
  • Pandas:将知识产权解析为国家/地区的最快方式

    我有一个函数find country from connection ip它需要一个 ip 经过一些处理后返回一个国家 地区 就像下面这样 def find country from connection ip ip Do some pro
  • 处理浏览器关闭事件和页面刷新

    在我们的应用程序中 我们需要处理浏览器关闭事件 当用户直接关闭浏览器时 我们应该给他一个警告消息 并根据某些条件直接关闭窗口来阻止他 我们已经通过 body onunload 事件处理了这个问题 问题是我们正在收到警报消息 但在显示警报消息
  • 通用GNU makefile目录路径

    我正在尝试使用通用的 makefile 来合并一些构建信息 我的问题是我想使用不同子目录级别的 makefile 这使得工作目录值 pwd 不可预料的 例如 Makefile common TOP shell pwd COMPONENT D
  • Java SPNEGO 身份验证和 Kerberos 约束委派 (KCD) 到后端服务

    我有一个 Java Web 应用程序 它在 Windows Active Directory 环境中对客户端进行 SPNEGO 身份验证 为了验证用户身份 我们使用来自旧 SPNEGO SourceForge 项目的代码 String en
  • Angular 1.4.5:未捕获错误:[$injector:modulerr] ngRoute

    当我尝试刷新页面时出现此错误 角度 js 38http errors angularjs org 1 4 5 http errors angularjs org 1 4 5 注射器 模块 p0 myApp p1 错误 3A 2 ogleap
  • java.sql.SQLException:数据库连接已关闭

    我的 Java SQLite 驱动程序 JDBC 有问题 当我想加载数据库时 它说它已加载 但实际上它已关闭 我将代码分成不同的文件 SQLite java package net jeddsan import java sql Conne
  • 编写 max 函数时输入错误

    max Int gt Int gt Int max a b if a gt b then a else b 你看到这个函数是正确的 但是如果我写 let a 3 let b 3 如果我写的话 ghci gt a b gt True 所以它比
  • 使用 vspackage 将上下文菜单项添加到解决方案资源管理器中的所有文件和文件夹

    我想将菜单项添加到解决方案资源管理器中所有文件和文件夹的上下文菜单中 我能够使用 vsct 文件中的此条目将菜单项添加到项目节点 menu type Context menu
  • 帮助为 Eclipse 设置 php

    我正在尝试设置 Eclipse 进行 php Web 开发 我想做的是从 Eclipse 中预览 php 网页 但我不知道如何做到这一点 是否有某种类型的集成 Web 服务器允许执行此操作 或者我是否必须设置 IIS Apache 才能执行
  • Google Cloud Functions 启用 CORS?

    我刚刚完成 Hello World Google Cloud Functions 教程并收到以下响应标头 Connection keep alive Content Length 14 Content Type text plain cha
  • Python + Selenium:我无法从 div 获取打印文本

    Python Selenium 我无法从此 div 获取打印文本 div class modal content div SignUp Failed Please Try Again div div 我试过这个 resp browser f
  • R-莱曼素性测试中的模数警告

    我花了一点时间破解莱曼素性测试的 R 实现 我借鉴的功能设计http davidkendal net articles 2011 12 lehmann primality test http davidkendal net articles