7

この問題は少し奇妙に感じました。データベース内の素数のリストをどのように表現できるか興味があります。大量の素数を正確かつ一貫して格納できる単一のデータ型を私は知りません。私の懸念は、素数に数千桁が含まれるようになると、データベースから参照するのが少し難しくなる可能性があることです。DB で素数の大きなセットを表す方法はありますか? このトピックには以前にアプローチしたことがあると確信しています。

これを難しくしている問題の 1 つは、素数を約数に分解できないことです。彼らができれば、この問題ははるかに簡単になります。

4

9 に答える 9

9

本当に素数を数値として保存したい場合、質問の1つとして「素数は因数に分解できない」ということです。別の方法があります。シーケンス順に並べられた任意の数のモジュラスのリストに保存します。

小さな例:

2831781 == 2*100^3 + 83*100^2 + 17*100^1 + 81*100^0

リストは次のとおりです。

81, 17, 83, 2

実際のアプリケーションでは、2^32 (32 ビット整数) のモジュラスで分割すると便利です。特に、処理アプリケーションで素数がバイト配列として格納されている場合に便利です。

DB への保存:

create table PRIMES
(
  PRIME_ID         NUMBER not null,
  PART_ORDER       NUMBER(20) not null,
  PRIME_PART_VALUE NUMBER not null
);

alter table PRIMES 
add constraint PRIMES_PK primary key (PRIME_ID, PART_ORDER) using index;

上記の例を挿入します(1647は例にすぎません):

insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 0, 81);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 1, 17);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 2, 83);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 3, 82);

prime_id 値は Oracle シーケンスから割り当てることができます ...

create sequence seq_primes start with 1 increment by 1;

挿入する次の素数の ID を取得します。

select seq_primes.nextval from dual;

指定された ID を持つ素数コンテンツを選択します。

select PART_ORDER, PRIME_PART_VALUE 
from primes where prime_id = 1647 
order by part_order
于 2009-12-16T13:54:27.993 に答える
6

それらをバイナリデータとして保存できます。データベースから直接人間が読み取れるわけではありませんが、問題にはなりません。

于 2009-12-15T13:25:48.947 に答える
5

データベース (データベースによって異なります) は、最大 38 ~ 39 桁の数値を定期的に正確に格納できます。それはあなたをかなり遠くに連れて行きます。

それを超えると、データベースで(正確に)算術演算を行うことはありません(特定のデータベースに存在する可能性のある任意精度のモジュールを除く)。ただし、数千桁まではテキストとして格納できます。さらに、CLOB 型のフィールドを使用して数百万桁を格納できます。

また、素数のシーケンスを格納していて、そのシーケンスの空間圧縮に関心がある場合は、整数ではなく、ある数値と次の数値の差を格納することから始めることができます。

于 2009-12-15T13:26:10.117 に答える
4

これは少し非効率的ですが、文字列として保存できます。

于 2009-12-15T13:23:29.327 に答える
3

これらの数値でデータベース側の計算を使用しない場合は、バイナリ表現 ( など) のビット シーケンスとして格納してBLOBくださいVARBINARY

于 2009-12-15T13:24:36.177 に答える
3

これが私の 2 セントの価値です。それらを数値としてデータベースに格納する場合は、データベースが処理できる整数の最大サイズによって制約されます。おそらく、一方の列に素数があり、もう一方の列にシーケンス番号がある 2 列のテーブルが必要です。次に、保存された値をすばやく見つけるために、いくつかのインデックスが必要です。

しかし、あなたは本当にそれをしたくありません.あなたは巨大な(sp?)素数を、あなたがまだ考えている整数データ型をはるかに超えて保存したいと思っています. そして、あなたは文字列が嫌いだと言っているので、それはあなたにとってバイナリデータです。(私にとってもそうです。) はい、それらをデータベースの BLOB に格納できますが、n 番目の素数を見つけたり、候補の整数の素数をチェックしたりするために、DBMS はどのような機能を提供しますか?

適切なファイル構造を設計するには? これは、約5分間考えた後、私が思いつくことができる最高のものです:

  1. カウンターを 2 に設定します。
  2. 最初の素数を表す 2 ビットを書きます。
  3. 2 ビット素数を含むセクションの終わりを示すために、それらを再度書き込みます。
  4. カウンターをcounter+1にする
  5. 3 ビットの素数を順番に書きます。(5と7の2つあると思います)
  6. 3 ビット素数の最後の部分を再度書き込み、3 ビット素数を含むセクションの終わりをマークします。
  7. 4 に戻り、必要な変更を加えて続行します。

最後の n ビットの素数を 2 回書き込むことのポイントは、ファイルを読み取るときに、n ビットの素数を含むファイルの部分の終わりを識別する手段を提供することです。

ファイルを作成するとき、おそらく n ビットの素数を含む各セクションの開始点など、さまざまな時点でのファイルへのオフセットを書き留めたいと思うでしょう。

これはうまくいくと思います.2^(表現できる最大の符号なし整数)までの素数を処理します。325467 ビット (たとえば) の値を大きな整数に変換するコードを見つけるのは簡単だと思います。

確かに、このファイルを BLOB として保存することはできますが、わざわざ保存する理由がわかりません。

于 2009-12-15T17:14:26.460 に答える
2

それはすべて、数値に対してどのような操作を行いたいかによって異なります。格納して検索するだけの場合は、文字列を使用し、チェック制約/ドメイン データ型を使用して数値であることを強制します。さらに制御したい場合は、PostgreSQL でカスタムのデータ型と関数を定義できます。たとえば、GMPライブラリと連携して、任意精度の整数に対して正しい順序付けと演算を行うことができます。このようなライブラリを使用すると、確率的素数性テストを使用して数値が本当に素数であるかどうかをチェックするチェック制約を実装することもできます。

本当の問題は、リレーショナル データベースがその仕事に適したツールであるかどうかです。

于 2009-12-15T16:34:32.530 に答える
0

BLOB を使用するのが最善だと思います。データが BLOB にどのように格納されるかは、数値の使用目的によって異なります。それらを計算で使用したい場合は、クラスまたは型を作成して、値をさまざまな順序付けられたバイナリ値として格納し、それらを数値などとして扱うことができるようにする必要があると思います。それらを表示するだけの場合は、それらを一連の文字として保存するだけで十分であり、計算可能な値を表示可能なものに変換する必要がなくなります。これは、大きな値に対して非常に時間がかかる可能性があります。

共有してお楽しみください。

于 2009-12-15T15:56:15.933 に答える
0

おそらく素晴らしいことではありませんが、それらを再帰的なデータ構造に格納するとどうなるでしょうか。int、指数、および下位ビット番号への参照として格納できます。

文字列のアイデアと同様に、おそらくメモリの考慮事項にはあまり適していません。また、クエリの再帰的な性質により、クエリ時間が長くなります。

于 2009-12-15T16:31:26.127 に答える