#素数 #数字 #哈希

Gen_Prime

将哈希转换为素数的方法

14个版本 (稳定)

使用旧的Rust 2015

1.1.9 2019年2月11日
1.1.7 2019年2月7日
1.1.5 2019年1月30日
0.1.2 2019年1月29日

#1548 in 数学

Download history 16/week @ 2024-03-26 74/week @ 2024-04-02

63 每月下载次数

AFL-1.1 许可证

10KB
146

Gen_Prime

将哈希转换为素数的方法。

说明

这是一个使用哈希计算素数的方法。想法非常简单:我们将哈希从16进制转换为特殊进制,取字符在10进制中的值并乘以2^i,其中i是字符在字符串中的位置。这个数n,我们计算余数模31,得到另一个数d。我们找到x=2^d-1和y=2^(d+1)-1的数。我们调用一个函数,它返回[x,y]中的第一个素数。这将是我们选择的结果。

我们使用模31的原因有两个

  1. 每个生成的素数都小于2^32。
  2. 我们可以处理高达2^512。如果每个素数都小于2^32,我们可以使用16个或更多的哈希。

[dependencies]
Gen_Prime = "1.1.5"
 

示例


示例1

extern crate primes;
 
 
# fn main() {
     let z:u128;
     println!("Introduce a hash");
     let mut a = String::new();
     std::io::stdin().read_line(&mut a).expect("Fail");
     let v : Vec<&str>=a.split("").collect();
     z=primes::hash_to_prime(v);
     println!("{}", z);

# } 
 

输出

输入一个哈希

a123dfe4758bc27237a

2147483647


输入一个哈希

074a4a47c445cf604b2ca687fed09fd8f3a78a16d20786b1a97aa6642fe0f87a8577a52cbace36bab6a6c40c3f1843be

1073741827


输入一个哈希

00eccf559792ee42e3ea26e394e9ab52ce569e47504d44715102cc0c2ab4f542dc54c383e8e13d360ebc57c5ede5e64b

16777259


输入一个哈希

daa41c63b728ba70e6c377d7d17d9e53185fc720e7e6326626608eb1edc3735f67d963c303d92c9196583f3cd8739943

16553


示例2

use std::io;
use std::u128;
extern crate bigint;
extern crate primes;
extern crate rand;
use bigint::U512;
 
# fn main() { 
     let mut mult:bigint::U512;
     mult=U512::one();
     loop{
         println!("Introduce a hash");
         let mut a = String::new();
         std::io::stdin().read_line(&mut a).expect("Fail");
         let v : Vec<&str>=a.split("").collect();
         let n2=v.len() as u32;
         let res:u128;
         let mut v2=Vec::with_capacity((n2-3) as usize);
         for i in 0..n2-3 {
             i as usize;
             v2.push(v[(i+1) as usize]);
         } //this lines are to safe each char in one component of a vector, and to delete white spaces
         res=primes::hash_to_prime(v2); //Generating a prime
         mult=mult*(bigint::U512::from(res as usize)); //Product of the primes
         println!("Do you want to enter another hash?[Y/N]");
         let mut b = String::new();
         io::stdin().read_line(&mut b).expect("Fail");
         let b : char = b.trim().parse().expect("Please, input one choice");
         if b=='N' || b=='n'{
             break;
         }
     }
     println!("{}", mult);
# }
 

输出

输入一个哈希

daa41c63b728ba70e6c377d7d17d9e53185fc720e7e6326626608eb1edc3735f67d963c303d92c9196583f3cd8739943

19

r:100

你想输入另一个哈希吗?[Y/N]

Y

输入一个哈希

0907b5ff1b7d6f7b2639ca00565c8f42cbf7529b992f825b2676ec30c294b477b913476d6a508da9d195f1dacc893173

23

r:39

你想输入另一个哈希吗?[Y/N]

Y

输入一个哈希

4cb34fd780fbac405a433f428bd5672c0f7003cf1ae9d0675225c8d83783c0fc57e8b1f64a9bad799084f71381d1115e

27

r:55

你想输入另一个哈希吗?[Y/N]

Y

输入一个哈希

fae89ae85b629f1d5263c7b5ad5035cc72c3cb02f95a9a242f5065f235611863f28fd4798818054e4cf69fd464e7f3b0

8

r:49

你想输入另一个哈希吗?[Y/N]

Y

输入一个哈希

d0054fddab35b4aa7ab1356811f5c5ef7a1536ccca1ac76549b36030c875c4329d12f86b67591e3d9b3ca7f178861c94

5

r:57

你想输入另一个哈希吗?[Y/N]

N

110277345636720260972118701,其中每个哈希后面的数字是模31(d)的值,r是一个随机数,用于计算[x,y]中的第r个素数。最后一个数字是所有素数的乘积。你能找到其中一个素数吗? ;)

依赖项

~490–710KB