有效地生成一个范围内的随机素数

厄立特里亚

我只需要在 [2, n^2] 范围内获得一个随机素数,其中 n 可以非常大(10^9 到 10^32)。我知道那些作业问题“如何在给定范围内打印素数”、“Eratosthene 筛”等。

如果可能,我想避免计算所有质数并随机选择一个。

我也不确定从范围中选择一个随机数并检查素数是否是解决这个问题的一种优雅/有效的方法。

这与安全目的无关。它只是算法实现(尝试实现)的一部分,它检查两个非常大的文件(> 1TB)是否相同。

任何想法如何获得一个专注于性能的绝对质数随机数?

编辑我正在尝试做的一个非常天真和简化的实现:

import java.math.BigInteger;
import java.util.stream.Collectors;

public class NewClass1 {    

    public static void main(String[] args) {
        //imagine this is my content of first file which is not at the same place as file two
        String file1 = "RDNZL";        
        //convert the content to bits
        file1 = toBits(file1); // 0101001001000100010011100101101001001100  

        //convert bits to number
        BigInteger  x = new BigInteger (file1, 2); //353333303884

        long p = 1187;  // select a random number between 2 and 1600 (String length * 8 bits = 40)
        // send p and x % p to validiate,
        long xMp = x.mod(BigInteger.valueOf(p)).longValue(); 
        System.out.println(check(p, xMp));
    }
    public static String toBits(String file){
        //convert each char to 8 bits and concat to string
        //just for simplification, i'am going to find a better way to solve this
        return file.chars().boxed()
                .map(Integer::toBinaryString).map(e->String.format("%8s", e).replace(' ', '0'))
                .collect(Collectors.joining("")); 
    }
    public static boolean check(long p, long xMp){
        //the other file which is somewhere else, in the cloud etc. 
        String file2 = "RDNZL";        
        file2 = toBits(file2); 

        BigInteger  y = new BigInteger (file2, 2); 
        long yMp = y.mod(BigInteger.valueOf(p)).longValue();
        return yMp == xMp;
    }
}

如果 yMp != xMp 与 100% 置信度文件不同,则算法无法识别出它们不同的可能性很小。

托马斯·韦勒

在 x 处找到素数的概率是 1/ln(x)。在您的情况下,这是 n²,n=10^32。所以可能性是 ln(10^64) 或大约 1/150。这意味着您必须平均测试大约 150 个数字,直到找到素数。

我没有可用的 Java,但我可以根据PSW primality test为您提供 Python 的结果积分去@primoCodegolf,尤其是这个答案

start = time()
n = next_prime((10**32)**2)
end = time()
print (n, " calcualted in ", end-start)

10000000000000000000000000000000000000000000000000000000000000057 calcualted in  0.00302 sec

所以是的,同时以一种有效的方式是可能的。

Wolfram Alpha证实了这一结果

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有效的方式来从一个更大的范围内删除范围的列表中的元素

如何有效地打开一个巨大的Excel文件

有没有一种有效的方法来生成具有给定总和或平均值的范围内的N个随机整数?

在OrderedDictionary中有效地找到上一个键

如何有效地将一个对象拆分为数组内的多个对象

TreeSet:有效地小于一个值的元素数

有效地计算给定范围内每个元素的出现

在Julia中某个范围内生成随机整数的有效方法

在提供的范围内仅创建一个随机素数

根据另一个列表有效地调整python列表

如何有效地查找网格中某个范围内的元素总数?

Python:有效地为每个组提取一个值

如何有效地隐藏ClusterManager中不在圆半径范围内的每个标记/簇?

有效检查数据框的日期是否在范围内,并返回一个计数

如何有效地散布一个numpy的二维数组

有效地生成不同的随机数

使用线程有效地逆转一个链表,该链表有效地拥有多达700万个节点

有效地将第一个月倒退

如何在另一个范围内生成随机范围的数字?

有什么方法可以快速有效地获取Bash中成千上万个CIDR /网络掩码范围内的IP主机地址?

F#:有效地从List.scan获取最后一个状态

如何有效地创建一个带有define()列表的数组?

如何最有效地找到L,R范围内的数组中最频繁的数字及其频率?

创建随机双打,统一在整个有效双打范围内

如何有效地获得给定范围内的除数之和?

有效地计算一个列表中的元素数量少于其他某个列表中的元素

如何从另一个 json 对象有效地创建嵌套的 json

有效地找到一个值属于哪个范围

在Numpy中有效地分配预定义范围内的值