1
1

有名素数で Hack されないように、大きい素数を列挙する

Last updated at Posted at 2024-02-04

競技プログラミングの問題において、素数を用いてハッシュを生成する場合などに、有名な素数 (例: 998244353) を用いると正答できないことがあります。

問題例 (ネタバレ防止のため折りたたんでいます) 日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339)F Product Equality

これは、事前に Hack 用のケースが作成されているためで、自前で大きな素数を生成することで対処可能です。

import sympy

# upper 未満の素数のうち、大きいもの n 個を列挙する
def take_bigprimes(upper, n):
    res = []
    for m in reversed(range(upper)):
        if sympy.isprime(m):
            res.append(m)
        if len(res) == n:
            break
    return list(reversed(res))

以下のようにしても良いかもしれません。
($2^{31}$ 以上 $2^{32}$ 未満 の素数を n 個生成します)

import sympy

n = 10
print(*[sympy.randprime(2**31, 2**32) for _ in range(n)])
# 4033449857 2254580123 3634403161 3038035321 2229663083 3939828643 3035911451 3227638327 2974499287 3451879493

コンテスト中でもコピペできるように、生成した素数 $2^{m}$ $(m \in {16,32,64,128,256})$ 未満の素数 $p$ のうち、大きいもの 50 個を以下に示します。

$p < 2^{16} = 65536$

64997 65003 65011 65027 65029 65033 65053 65063 65071 65089 65099 65101 65111 65119 65123 65129 65141 65147 65167 65171 65173 65179 65183 65203 65213 65239 65257 65267 65269 65287 65293 65309 65323 65327 65353 65357 65371 65381 65393 65407 65413 65419 65423 65437 65447 65449 65479 65497 65519 65521

$p < 2^{32} = 4294967296$

4294966043 4294966073 4294966087 4294966099 4294966121 4294966129 4294966153 4294966163 4294966177 4294966187 4294966217 4294966231 4294966237 4294966243 4294966297 4294966337 4294966367 4294966373 4294966427 4294966441 4294966447 4294966477 4294966553 4294966583 4294966591 4294966619 4294966639 4294966651 4294966657 4294966661 4294966667 4294966769 4294966813 4294966829 4294966877 4294966909 4294966927 4294966943 4294966981 4294966997 4294967029 4294967087 4294967111 4294967143 4294967161 4294967189 4294967197 4294967231 4294967279 4294967291

$p < 2^{64} = 18446744073709551616$

18446744073709549519 18446744073709549571 18446744073709549583 18446744073709549613 18446744073709549621 18446744073709549667 18446744073709549733 18446744073709549757 18446744073709549777 18446744073709549811 18446744073709549817 18446744073709549861 18446744073709549951 18446744073709550009 18446744073709550033 18446744073709550047 18446744073709550099 18446744073709550111 18446744073709550129 18446744073709550141 18446744073709550147 18446744073709550237 18446744073709550293 18446744073709550341 18446744073709550381 18446744073709550537 18446744073709550539 18446744073709550591 18446744073709550593 18446744073709550671 18446744073709550681 18446744073709550717 18446744073709550719 18446744073709550771 18446744073709550773 18446744073709550791 18446744073709550873 18446744073709551113 18446744073709551163 18446744073709551191 18446744073709551253 18446744073709551263 18446744073709551293 18446744073709551337 18446744073709551359 18446744073709551427 18446744073709551437 18446744073709551521 18446744073709551533 18446744073709551557

$p < 2^{128} = 340282366920938463463374607431768211456$

340282366920938463463374607431768207107 340282366920938463463374607431768207179 340282366920938463463374607431768207227 340282366920938463463374607431768207269 340282366920938463463374607431768207467 340282366920938463463374607431768207571 340282366920938463463374607431768207611 340282366920938463463374607431768207619 340282366920938463463374607431768207829 340282366920938463463374607431768207941 340282366920938463463374607431768207991 340282366920938463463374607431768207997 340282366920938463463374607431768208049 340282366920938463463374607431768208097 340282366920938463463374607431768208147 340282366920938463463374607431768208151 340282366920938463463374607431768208739 340282366920938463463374607431768208969 340282366920938463463374607431768208979 340282366920938463463374607431768208997 340282366920938463463374607431768209101 340282366920938463463374607431768209269 340282366920938463463374607431768209333 340282366920938463463374607431768209411 340282366920938463463374607431768209477 340282366920938463463374607431768209503 340282366920938463463374607431768209521 340282366920938463463374607431768209587 340282366920938463463374607431768209599 340282366920938463463374607431768209657 340282366920938463463374607431768209771 340282366920938463463374607431768209777 340282366920938463463374607431768209881 340282366920938463463374607431768209921 340282366920938463463374607431768209969 340282366920938463463374607431768209977 340282366920938463463374607431768210037 340282366920938463463374607431768210047 340282366920938463463374607431768210049 340282366920938463463374607431768210151 340282366920938463463374607431768210263 340282366920938463463374607431768210659 340282366920938463463374607431768210743 340282366920938463463374607431768210781 340282366920938463463374607431768211099 340282366920938463463374607431768211181 340282366920938463463374607431768211219 340282366920938463463374607431768211223 340282366920938463463374607431768211283 340282366920938463463374607431768211297

$p < 2^{256} = 115792089237316195423570985008687907853269984665640564039457584007913129639936$

115792089237316195423570985008687907853269984665640564039457584007913129630471 115792089237316195423570985008687907853269984665640564039457584007913129630493 115792089237316195423570985008687907853269984665640564039457584007913129630513 115792089237316195423570985008687907853269984665640564039457584007913129630997 115792089237316195423570985008687907853269984665640564039457584007913129631059 115792089237316195423570985008687907853269984665640564039457584007913129631101 115792089237316195423570985008687907853269984665640564039457584007913129631357 115792089237316195423570985008687907853269984665640564039457584007913129631453 115792089237316195423570985008687907853269984665640564039457584007913129631687 115792089237316195423570985008687907853269984665640564039457584007913129631783 115792089237316195423570985008687907853269984665640564039457584007913129631953 115792089237316195423570985008687907853269984665640564039457584007913129632247 115792089237316195423570985008687907853269984665640564039457584007913129632379 115792089237316195423570985008687907853269984665640564039457584007913129632817 115792089237316195423570985008687907853269984665640564039457584007913129633171 115792089237316195423570985008687907853269984665640564039457584007913129633313 115792089237316195423570985008687907853269984665640564039457584007913129633397 115792089237316195423570985008687907853269984665640564039457584007913129633601 115792089237316195423570985008687907853269984665640564039457584007913129633717 115792089237316195423570985008687907853269984665640564039457584007913129633777 115792089237316195423570985008687907853269984665640564039457584007913129633819 115792089237316195423570985008687907853269984665640564039457584007913129634101 115792089237316195423570985008687907853269984665640564039457584007913129634423 115792089237316195423570985008687907853269984665640564039457584007913129634587 115792089237316195423570985008687907853269984665640564039457584007913129634611 115792089237316195423570985008687907853269984665640564039457584007913129634687 115792089237316195423570985008687907853269984665640564039457584007913129634839 115792089237316195423570985008687907853269984665640564039457584007913129634843 115792089237316195423570985008687907853269984665640564039457584007913129635089 115792089237316195423570985008687907853269984665640564039457584007913129635257 115792089237316195423570985008687907853269984665640564039457584007913129635337 115792089237316195423570985008687907853269984665640564039457584007913129635457 115792089237316195423570985008687907853269984665640564039457584007913129635623 115792089237316195423570985008687907853269984665640564039457584007913129635649 115792089237316195423570985008687907853269984665640564039457584007913129635919 115792089237316195423570985008687907853269984665640564039457584007913129636031 115792089237316195423570985008687907853269984665640564039457584007913129636463 115792089237316195423570985008687907853269984665640564039457584007913129636801 115792089237316195423570985008687907853269984665640564039457584007913129637179 115792089237316195423570985008687907853269984665640564039457584007913129637873 115792089237316195423570985008687907853269984665640564039457584007913129638053 115792089237316195423570985008687907853269984665640564039457584007913129638397 115792089237316195423570985008687907853269984665640564039457584007913129638637 115792089237316195423570985008687907853269984665640564039457584007913129638883 115792089237316195423570985008687907853269984665640564039457584007913129639013 115792089237316195423570985008687907853269984665640564039457584007913129639319 115792089237316195423570985008687907853269984665640564039457584007913129639349 115792089237316195423570985008687907853269984665640564039457584007913129639501 115792089237316195423570985008687907853269984665640564039457584007913129639579 115792089237316195423570985008687907853269984665640564039457584007913129639747

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1