openssl prime 检验与生成质数

openssl 是一个开源工具包,主要用于网络通信工作。noi linux 2.0 已经安装。我们不难发现有个工具叫 prime

noi@noi-HP-288-Pro-G3-MT:~$ openssl help
Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dhparam           
dsa               dsaparam          ec                ecparam           
enc               engine            errstr            gendsa            
genpkey           genrsa            help              list              
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              rehash            
req               rsa               rsautl            s_client          
s_server          s_time            sess_id           smime             
speed             spkac             srp               storeutl          
ts                verify            version           x509              

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4               
md5               rmd160            sha1              sha224            
sha256            sha3-224          sha3-256          sha3-384          
sha3-512          sha384            sha512            sha512-224        
sha512-256        shake128          shake256          sm3               

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb      
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb      
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1     
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb      
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8     
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64            
bf                bf-cbc            bf-cfb            bf-ecb            
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast              
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb         
cast5-ofb         des               des-cbc           des-cfb           
des-ecb           des-ede           des-ede-cbc       des-ede-cfb       
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb      
des-ede3-ofb      des-ofb           des3              desx              
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          sm4-cbc           sm4-cfb           
sm4-ctr           sm4-ecb           sm4-ofb   

考虑查看 openssl prime 的使用帮助。

Usage: prime [options] [number...]
  number Number to check for primality
 -help         Display this summary
 -hex          Hex output
 -generate     Generate a prime
 -bits +int    Size of number in bits
 -safe         When used with -generate, generate a safe prime
 -checks +int  Number of checks

也就是 openssl prime 加一个数字可以判断是否为质数。openssl prime -generate -bits 位数 生成指定二进制位数的质数。checks 参数是一次指定多个质数进行检验。safe 参数生成 safe prime,一个 safe prime \(p\) 满足不仅 \(p\) 为奇质数而且 \((p-1)/2\) 为质数。

下面是一个实例:

noi@noi-HP-288-Pro-G3-MT:~$ openssl prime 998244353
3B800001 (998244353) is prime
noi@noi-HP-288-Pro-G3-MT:~$ openssl prime -generate -bits 32
3575265439
noi@noi-HP-288-Pro-G3-MT:~$ openssl prime -generate -bits 32 -safe
3563108279
noi@noi-HP-288-Pro-G3-MT:~$ openssl prime -checks 2 3575265439 3563108279
D51A389F (3575265439) is prime
D460B7B7 (3563108279) is prime

第二届你要魔怔杯鲜花大赛!!!采用话题作文的形式,题目如下。

素性测试

选择一个奇素数,写一篇文章。这个数应该是特殊的,也就是说如果想用别的数来写(这个数不限于奇素数)且仅进行 \(O(1)\) 的修改,就难以达到相近或更好的效果。

不难发现这正是 openssl prime 所擅长的(指素性测试)。因为有要求:

为了进行素性测试,要求这个素数的二进制位数在5000以内。

考虑走极端,生成一个二进制位数 \(5000\) 的质数并令其检验:

noi@noi-HP-288-Pro-G3-MT:~$ time openssl prime -generate -bits 5000
131147847544613706457463015983828576917575414488162371776473706596622180204560635248405080059983596975029469924038688599232632447116688119205964540254692662421360886642509141914533364535690051205086297510680265017472345759386327735558495166999642629695568526149451073622491069901730844652535414968736331901445118997433571932779600181019487575986739512078422091065700539091787662631701111832672495950877392443065496555247155557249415775814104847709601623583745628971545805892129769868926139612518563171371488033301360863132348460266653267782295236650243293326996109701932161161985401828429022221358428657394465941841170511293320430746075539311384958680286829502518710496083059887639689641851158639052213388516731666370170952439756835087121487286256275558243157194103371540405425939482140348004270297956053595770105451049356052446678707639689748756473923024863695261827375967389782615208522342798335556111868589362516902365278966259074890393858412496122061404288618784138478244260211709051707280922232743560865522150476901311480167209871743722579374277218994172261728424090131941995873615162392219269127427881199910262764917834783179201470330818874908311425382551232494935855851601276117394439339321939529327286956553516763055663331481734631061653134401502476122425827286884220060952651454255103959177166230493372226064819781351063811154452313722878058149385871739429700522901606205308751493870232050241813444672674932714860208306105986861799032780571813624076490332459764703880563558326759276824394811925413

real	0m19.668s
user	0m19.629s
sys	0m0.004s
noi@noi-HP-288-Pro-G3-MT:~$ time openssl prime 131147847544613706457463015983828576917575414488162371776473706596622180204560635248405080059983596975029469924038688599232632447116688119205964540254692662421360886642509141914533364535690051205086297510680265017472345759386327735558495166999642629695568526149451073622491069901730844652535414968736331901445118997433571932779600181019487575986739512078422091065700539091787662631701111832672495950877392443065496555247155557249415775814104847709601623583745628971545805892129769868926139612518563171371488033301360863132348460266653267782295236650243293326996109701932161161985401828429022221358428657394465941841170511293320430746075539311384958680286829502518710496083059887639689641851158639052213388516731666370170952439756835087121487286256275558243157194103371540405425939482140348004270297956053595770105451049356052446678707639689748756473923024863695261827375967389782615208522342798335556111868589362516902365278966259074890393858412496122061404288618784138478244260211709051707280922232743560865522150476901311480167209871743722579374277218994172261728424090131941995873615162392219269127427881199910262764917834783179201470330818874908311425382551232494935855851601276117394439339321939529327286956553516763055663331481734631061653134401502476122425827286884220060952651454255103959177166230493372226064819781351063811154452313722878058149385871739429700522901606205308751493870232050241813444672674932714860208306105986861799032780571813624076490332459764703880563558326759276824394811925413
EDB24EBE3CDA52434AE03F79CADE882DCC3135B9849AFF5C22EEB1BAE31535B694B1E338EB4D4E53ED63CF6DBD7B8724AD4DAEB9EC25EE713CA6999CA23A3D9850A12D0F22F7E4049D1E4C6D4D68F264388A548BAAA3B17957B357117CB10C3573DC4157E61CA4B301810B84FF8B2758E2827271B5B35168025055B18DC2359212CC6459879ADD6EE68617374B88DA01CC5A110FBC979BF0EC213A5EB0D21049ABE02AE92B08AD9244981BC118EA0F25832FCAC371EDBCCC2765E3175F9721514D5A69371CDE591B07B8AD8DFAB0D631610DDF405D55DAC7D1523C9B97CB591D07621AE1C2ED6FCB9BEF8EA3D20FF9FE8360D197AD49E2B346F981B97297F22423951C0934F449833BB12EC4BC8F3DAEA9BD88B865D1636D12E44BCD9E98CD5FFB54673454350EC08836C5559978100E1D80B1A784C097968E490DCA99F4C40F4679D65CC9BF365E878D313E3B2556F52690508D7D8251125DB22DC8CF6E9157335EC47D27A2F0FFF434EC7CECC5A6907EA7E6CD04E13150E32D4F0DB237907B97515D26359A06064A76C9555955B3B13D3F2CA3DFDC77836ECC502E9C20A302F55C75FFA0513B044C794FF2E437CB6DE88325EF44EBA6134921C747079C3575DBFF1D8292704D23B0EC95B4F333FF604CCBFA97C6357D4239081A0BEE73259D56E2B0984CEA3679472F5740ACCDE3B486CDE8170F4EDD2310C519907BAE98B4F850BB28C3C867C32C3DA26226AAFF5736A6B26EB8F76C1E640070A7BC4CED44DA8E5CAB082D61121BC196677F5DD1BA29FE375AA04C6180400501DB73F5162E5A4AA5C45E6258D1A52127DF4E2DA66DE75030BB4E5E042330866192B3C847C15DD456FA0B755F1BE42866B7C9F52963A5 (131147847544613706457463015983828576917575414488162371776473706596622180204560635248405080059983596975029469924038688599232632447116688119205964540254692662421360886642509141914533364535690051205086297510680265017472345759386327735558495166999642629695568526149451073622491069901730844652535414968736331901445118997433571932779600181019487575986739512078422091065700539091787662631701111832672495950877392443065496555247155557249415775814104847709601623583745628971545805892129769868926139612518563171371488033301360863132348460266653267782295236650243293326996109701932161161985401828429022221358428657394465941841170511293320430746075539311384958680286829502518710496083059887639689641851158639052213388516731666370170952439756835087121487286256275558243157194103371540405425939482140348004270297956053595770105451049356052446678707639689748756473923024863695261827375967389782615208522342798335556111868589362516902365278966259074890393858412496122061404288618784138478244260211709051707280922232743560865522150476901311480167209871743722579374277218994172261728424090131941995873615162392219269127427881199910262764917834783179201470330818874908311425382551232494935855851601276117394439339321939529327286956553516763055663331481734631061653134401502476122425827286884220060952651454255103959177166230493372226064819781351063811154452313722878058149385871739429700522901606205308751493870232050241813444672674932714860208306105986861799032780571813624076490332459764703880563558326759276824394811925413) is prime

real	0m1.143s
user	0m1.139s
sys	0m0.004s

发现效率很高。生成质数 131147847544613706457463015983828576917575414488162371776473706596622180204560635248405080059983596975029469924038688599232632447116688119205964540254692662421360886642509141914533364535690051205086297510680265017472345759386327735558495166999642629695568526149451073622491069901730844652535414968736331901445118997433571932779600181019487575986739512078422091065700539091787662631701111832672495950877392443065496555247155557249415775814104847709601623583745628971545805892129769868926139612518563171371488033301360863132348460266653267782295236650243293326996109701932161161985401828429022221358428657394465941841170511293320430746075539311384958680286829502518710496083059887639689641851158639052213388516731666370170952439756835087121487286256275558243157194103371540405425939482140348004270297956053595770105451049356052446678707639689748756473923024863695261827375967389782615208522342798335556111868589362516902365278966259074890393858412496122061404288618784138478244260211709051707280922232743560865522150476901311480167209871743722579374277218994172261728424090131941995873615162392219269127427881199910262764917834783179201470330818874908311425382551232494935855851601276117394439339321939529327286956553516763055663331481734631061653134401502476122425827286884220060952651454255103959177166230493372226064819781351063811154452313722878058149385871739429700522901606205308751493870232050241813444672674932714860208306105986861799032780571813624076490332459764703880563558326759276824394811925413 即十六进制 EDB24EBE3CDA52434AE03F79CADE882DCC3135B9849AFF5C22EEB1BAE31535B694B1E338EB4D4E53ED63CF6DBD7B8724AD4DAEB9EC25EE713CA6999CA23A3D9850A12D0F22F7E4049D1E4C6D4D68F264388A548BAAA3B17957B357117CB10C3573DC4157E61CA4B301810B84FF8B2758E2827271B5B35168025055B18DC2359212CC6459879ADD6EE68617374B88DA01CC5A110FBC979BF0EC213A5EB0D21049ABE02AE92B08AD9244981BC118EA0F25832FCAC371EDBCCC2765E3175F9721514D5A69371CDE591B07B8AD8DFAB0D631610DDF405D55DAC7D1523C9B97CB591D07621AE1C2ED6FCB9BEF8EA3D20FF9FE8360D197AD49E2B346F981B97297F22423951C0934F449833BB12EC4BC8F3DAEA9BD88B865D1636D12E44BCD9E98CD5FFB54673454350EC08836C5559978100E1D80B1A784C097968E490DCA99F4C40F4679D65CC9BF365E878D313E3B2556F52690508D7D8251125DB22DC8CF6E9157335EC47D27A2F0FFF434EC7CECC5A6907EA7E6CD04E13150E32D4F0DB237907B97515D26359A06064A76C9555955B3B13D3F2CA3DFDC77836ECC502E9C20A302F55C75FFA0513B044C794FF2E437CB6DE88325EF44EBA6134921C747079C3575DBFF1D8292704D23B0EC95B4F333FF604CCBFA97C6357D4239081A0BEE73259D56E2B0984CEA3679472F5740ACCDE3B486CDE8170F4EDD2310C519907BAE98B4F850BB28C3C867C32C3DA26226AAFF5736A6B26EB8F76C1E640070A7BC4CED44DA8E5CAB082D61121BC196677F5DD1BA29FE375AA04C6180400501DB73F5162E5A4AA5C45E6258D1A52127DF4E2DA66DE75030BB4E5E042330866192B3C847C15DD456FA0B755F1BE42866B7C9F52963A5 仅运行 19 秒,检验仅花费 1 秒。

可应用 openssl prime 至 OI 中,随机生成指定级别的哈希模数与底数,将推动 OI 事业的发展。

posted @ 2024-07-07 20:34  caijianhong  阅读(28)  评论(0编辑  收藏  举报