Frage

Dieses Problem schien mir eine ungerade Bit. Ich bin gespannt, wie Sie eine Liste von Primzahlen in einer Datenbank darstellen könnten. Ich weiß nicht, von einem einzigen Datentyp, der zu acuratly der Lage sein würde, und konsequent eine große Menge von Primzahlen speichern. Meine Sorge ist, dass, wenn die Primzahlen beginnen 1000s Ziffern enthalten, dass es die Datenbank ein bisschen schwierig zu Referenzform sein könnte. Gibt es eine Möglichkeit, eine große Anzahl von Primzahlen in einem DB zu vertreten? Ich bin mir ziemlich sicher, dass dieses Thema vor genähert hat wurde.

Eine der Fragen über diese, das es schwierig macht, ist, dass Primzahlen nicht nach unten in Faktoren zerlegt werden. Wenn sie könnte, wäre dieses Problem viel einfacher.

War es hilfreich?

Lösung

Wenn Sie wirklich speichern Primzahlen als Zahlen wollen und eine der Fragen, Stoppen Sie ist „Primzahlen kann nicht nach unten in Faktoren zerlegt werden“, gibt es eine andere Sache: Laden sie in der Liste der E-Modul einer beliebigen Anzahl von Reihenfolge geordnet.

Kleines Beispiel:

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

Liste ist:

81, 17, 83, 2

In realer Anwendung nützlich ist, durch Modul von 2 ^ 32 (32-Bit ganzen Zahlen) aufzuzuspalten, besonders, wenn die Verarbeitung in Primzahlen Anwendung als Byte-Arrays gespeichert.

Speicher in 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;

Einsatz zum Beispiel oben (1647 ist zum Beispiel nur):

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 Wert kann von Oracle-Sequenz zugeordnet wird ...

create sequence seq_primes start with 1 increment by 1;

Get ID des nächsten Primzahl einzufügen:

select seq_primes.nextval from dual;

wählen Primzahl Inhalt mit dem angegebenen ID:

select PART_ORDER, PRIME_PART_VALUE 
from primes where prime_id = 1647 
order by part_order

Andere Tipps

Sie könnten sie als binäre Daten speichern. Sie werden nicht von Menschen lesbare direkt aus der Datenbank enthalten sein, aber das sollte kein Problem sein.

Datenbanken (je nach) kann Zahlen routinemäßig Speicher von bis zu 38-39 Ziffern genau. Das bekommt man ziemlich weit.

Darüber hinaus werden Sie nicht tun arithmetische Operationen an ihnen werden (genau) in Datenbanken (abgesehen von beliebiger Genauigkeit Module, die für die jeweilige Datenbank vorhanden sein kann). Aber Zahlen können auf mehrere tausend Stellen als Text oben gespeichert werden. Darüber hinaus Sie CLOB Typ Felder zum Speichern von Millionen von Stellen verwenden können.

Außerdem ist es nichts wert, wenn Sie Sequenzen von Primzahlen sind Speicher und Ihr Interesse ist in der Raum-Kompression dieser Sequenz Sie durch Speicher die Differenz zwischen einer Zahl und der nächsten anstatt der gesamten Zahl beginnen kann.

Das ist ein bisschen ineffizient, aber man konnte sie als Strings gespeichert werden.

Wenn Sie nicht mit diesen Zahlen zu bedienende Datenbank-Seite Berechnungen gehen, nur speichern sie als Bitfolgen ihrer binären Darstellung (BLOB, VARBINARY usw.)

Hier ist meine 2 Cent wert. Wenn Sie wollen, dass sie speichern, wie Zahlen in einer Datenbank dann werden Sie durch die maximale Größe der ganzen Zahl beschränkt werden, dass die Datenbank verarbeiten kann. Sie würden wahrscheinlich einen 2 Säulentisch, mit der Primzahl in einer Spalte und die Sequenznummer in dem anderes wollen. Dann würden Sie einige Indizes wollen schnell die gespeicherten Werte gefunden werden können.

Aber Sie wollen nicht wirklich tun, was Sie tun, Sie wollen humongous speichern (sp?) Primzahlen Weg jenseits jeder Integer-Datentyp haben Sie, obwohl der noch. Und Sie sagen, dass Sie in Strings abgeneigt sind, so dass es für Sie Binärdaten ist. (Es wäre auch für mich.) Ja, könnten Sie speichern sie in einem BLOB in einer Datenbank, sondern welche Art von Einrichtungen werden das DBMS bieten Sie für die Suche nach der n-ten Primzahl oder der Überprüfung der primeness eines Kandidaten integer?

Wie eine geeignete Dateistruktur zu entwerfen? Dies ist die beste, das ich mit nach ca. 5 Minuten kommen könnte denken:

  1. Stellen Sie einen Zähler auf 2.
  2. Schreiben Sie die zwei Bits, die die erste Primzahl darstellen.
  3. Schreiben Sie sie erneut, um das Ende des Abschnitts markieren die 2-Bit-Primzahlen enthält.
  4. Stellen Sie den Zähler zu Zähler + 1
  5. Schreiben Sie die 3-Bit-Primzahlen um. (Ich glaube, es gibt zwei: 5 und 7)
  6. Schreiben Sie die letzte der 3-Bit-Primzahlen wieder das Ende des Abschnitts markieren die 3-Bit-Primzahlen enthält.
  7. Gehen Sie zurück zu 4 und tragen auf mutatis mutandis.

Der Punkt über die letzten n-Bit-Primzahl Schreiben doppelt so groß ist, Sie mit einem Mittel, das Ende des Teils der Datei mit n-Bit-Primzahlen darin zu identifizieren, wenn Sie kommen, um die Datei zu lesen.

Wenn Sie die Datei zu schreiben, werden Sie wahrscheinlich wollen auch Kenntnis von dem Offsets in die Dateien an verschiedenen Stellen machen, vielleicht Anfang jeden Abschnitts n-Bit-Primzahlen enthält.

ich denke, das funktionieren würde, und es würde Primzahlen 2 Griff nach oben ^ (der größten ganzen Zahl ohne Vorzeichen Sie repräsentieren können). Ich denke, es wäre leicht genug sein, Code zu finden für eine 325.467-Bit (sagen wir) Wert in eine große ganze Zahl zu übersetzen.

Natürlich könnten Sie speichern diese Datei als BLOB aber ich bin nicht sicher, warum Sie würde stören.

Es hängt alles davon ab, welche Arten von Operationen wollen Sie mit den Zahlen zu tun. Wenn nur speichern und Lookup, dann nur Zeichenfolge verwenden und einen Check-Constraint / Domain-Datentyp verwenden, um durchzusetzen, dass sie Zahlen sind. Wenn Sie mehr Kontrolle wünschen, dann wird PostgreSQL können Sie benutzerdefinierte Datentypen definieren und Funktionen. Sie können zum Beispiel Schnittstelle mit der GMP Bibliothek korrekte Reihenfolge und Arithmetik für ganze Zahlen beliebiger Genauigkeit zu haben. Unter Verwendung einer solchen Bibliothek können Sie sogar eine Check-Einschränkung implementieren, die die probabilistischen Primzahltest verwendet, um zu überprüfen, ob die Zahlen wirklich prim sind.

Die eigentliche Frage ist tatsächlich, ob eine relationale Datenbank ist das richtige Werkzeug für den Job.

Ich glaube, Sie sind am besten aus einem BLOB verwenden. Wie die Daten in Ihrem BLOB gespeichert wird, hängt von Ihrer beabsichtigten Verwendung der Zahlen. Wenn Sie sie in Berechnungen verwenden wollen denke ich, werden Sie eine Klasse erstellen müssen, oder geben Sie die Werte als eine Vielzahl von geordneten binären Wert zu speichern und es ihnen ermöglichen, als Zahlen behandelt werden, etc. Wenn Sie sie nur anzeigen müssen dann sie als eine Folge von Zeichen zu speichern wäre ausreichend, und würde die Notwendigkeit beseitigt Ihre berechenbaren Werte etwas darstellbaren zu konvertieren, was sehr zeit für große Werte aufwendig sein kann.

Teile und genießen.

Wahrscheinlich nicht brillant, aber was ist, wenn Sie sie in irgendeiner rekursive Datenstruktur gespeichert. Sie könnten speichern Sie es als int, es Exponent, und einen Verweis auf die unteren Bit-Zahlen.

Wie die Zeichenfolge Idee, es wäre wahrscheinlich nicht sehr gut für das Gedächtnis Überlegungen. Und Abfragezeit aufgrund der rekursiven Art der Abfrage erhöht werden würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top