パワーごとに1つのエントリを持つ小さな優先キューを使用することは、数値を一覧表示するための合理的な方法です。次のPythonコードを参照してください。
import Queue # in Python 3 say: queue
pmax, vmax = 10, 150
Q=Queue.PriorityQueue(pmax)
p = 2
for e in range(2,pmax):
p *= 2
Q.put((p,2,e))
print 1,1,2
while not Q.empty():
(v, b, e) = Q.get()
if v < vmax:
print v, b, e
b += 1
Q.put((b**e, b, e))
上記のコードのようにpmax、vmaxを使用すると、次の出力が生成されます。提案された問題については、pmax
andvmax
を64
andに置き換え2**64
ます。
1 1 2
4 2 2
8 2 3
9 3 2
16 2 4
16 4 2
25 5 2
27 3 3
32 2 5
36 6 2
49 7 2
64 2 6
64 4 3
64 8 2
81 3 4
81 9 2
100 10 2
121 11 2
125 5 3
128 2 7
144 12 2
このメソッドの複雑さはO(vmax ^ 0.5 * log(pmax))です。これは、完全な正方形の数が完全な立方体、4乗などの数よりも支配的であり、各正方形に対してO(log(pmax))作業を実行して操作get
をput
キューに入れるためです。より高いパワーの場合、計算時にO(log(pmax))の作業を行いますb**e
。
の場合vmax,pmax =64, 2**64
、約2 *(2 ^ 32 + 2 ^ 21 + 2 ^ 16 + 2 ^ 12 + ...)のキュー操作、つまり約2^33のキュー操作があります。
追加のメモ:このメモは、cf16のコメント、「1つのコメントのみ、「完全な立方体の数、4乗などの数よりも完全な正方形の数が支配的であるとは思わない」に対応しています。それらはすべて無限です。しかし、そうです、有限集合を考えれば」。物事の全体的な数学的スキームにおいて、カーディナリティは同じであることは事実です。つまり、が整数のすべての'乗P(j)
のセットである場合、すべての整数のカーディナリティ。任意の2セットのパワーの要素は、互いに1対1で対応させることができます。j
P(j) == P(k)
j,k > 0
それにもかかわらず、昇順で完全な累乗を計算する場合、有限であるかどうかに関係なく、計算される数に関係なく、正方形を提供する作業が他の累乗の作業を支配します。任意のxについて、 xの領域の完全なk乗の密度は、 kが増加するにつれて指数関数的に減少します。xが増加すると、 xの領域の完全なk乗の密度は( x 1 / k)/ xに比例します。したがって、 xが増加すると、3乗、4乗などは、二乗に比べてほとんどなくなります。
具体的な例として、1e8と1e9の間の累乗の中で、(2; 3; 4; 5; 6)の累乗の数は約(21622; 535; 77; 24; 10)です。1e8と1e9の間には、正方形よりも高い累乗のインスタンスの30倍以上の正方形があります。2つの数の間の完全な平方の数と、より高い完全な累乗の数の比率は次のとおりです。10¹⁰–10¹⁵、r≈301; 10¹⁵–10²⁰、r≈2K; 10²⁰–10²⁵、r≈15K; 10²⁵–10³⁰、r≈100K。要するに、xが増加するにつれて、累乗が昇順で提供される場合、正方形がますます支配的になります。