Speichern von großen Primzahlen in einer Datenbank

7

Dieses Problem erschien mir ein bisschen merkwürdig. Ich bin gespannt, wie Sie eine Liste von Primzahlen in einer Datenbank darstellen können. Ich kenne keinen einzigen Datentyp, der eine große Anzahl von Primzahlen akurat und konsistent speichern könnte. Meine Sorge ist, dass, wenn die Primzahlen beginnen, Tausende von Ziffern zu enthalten, dass es ein bisschen schwierig sein könnte, sich auf die Datenbank zu beziehen. Gibt es eine Möglichkeit, eine große Menge von Primzahlen in einer Datenbank darzustellen? Ich bin mir ziemlich sicher, dass dieses Thema schon einmal angegangen wurde.

Eine Schwierigkeit, die es schwierig macht, ist, dass Primzahlen nicht in Faktoren zerlegt werden können. Wenn sie könnten, wäre dieses Problem viel einfacher.

    
monksy 15.12.2009, 13:20
quelle

9 Antworten

9

Wenn Sie Primzahlen wirklich als Zahlen und als eine Frage speichern wollen, stört Sie, dass "Primzahlen nicht in Faktoren zerlegt werden können". Es gibt noch eine andere Sache: Speichern Sie sie in der Liste des Moduls einer beliebigen nach Sequenz sortierten Zahl.

Kleines Beispiel:

%Vor%

Liste ist:

%Vor%

In der realen Anwendung ist es nützlich, durch den Modulus von 2 ^ 32 (32-Bit-Ganzzahlen) zu trennen, besonders wenn Primzahlen in der Verarbeitungsanwendung als Bytearrays gespeichert werden.

Speicherung in DB:

%Vor%

zum Beispiel oben einfügen (1647 ist nur Beispiel):

%Vor%

prime_id Wert kann von oracle sequence ...

zugewiesen werden %Vor%

Erhalte die ID der nächsten einzufügenden Primzahl:

%Vor%

Wählen Sie den Inhalt der Primzahl mit der angegebenen ID:

%Vor%     
ThinkJet 16.12.2009, 13:54
quelle
6

Sie könnten sie als Binärdaten speichern. Sie werden nicht direkt von der Datenbank lesbar sein, aber das sollte kein Problem sein.

    
nickf 15.12.2009 13:25
quelle
5

Datenbanken (abhängig davon) können routinemäßig Nummern bis zu 38-39 Ziffern genau speichern. Das bringt dich ziemlich weit.

Darüber hinaus werden Sie keine arithmetischen Operationen auf ihnen (genau) in Datenbanken durchführen (ohne Module mit beliebiger Genauigkeit, die für Ihre spezielle Datenbank existieren könnten). Aber Zahlen können als Text bis zu mehreren tausend Ziffern gespeichert werden. Darüber hinaus können Sie CLOB-Felder verwenden, um Millionen von Ziffern zu speichern.

Es ist auch nichts wert, wenn Sie Sequenzen von Primzahlen speichern und Ihr Interesse an der Raumkompression dieser Sequenz besteht, könnten Sie damit beginnen, die Differenz zwischen einer Zahl und der nächsten statt der ganzen Zahl zu speichern.

    
cletus 15.12.2009 13:26
quelle
4
___ answer1907451 ___

Datenbanken (abhängig davon) können routinemäßig Nummern bis zu 38-39 Ziffern genau speichern. Das bringt dich ziemlich weit.

Darüber hinaus werden Sie keine arithmetischen Operationen auf ihnen (genau) in Datenbanken durchführen (ohne Module mit beliebiger Genauigkeit, die für Ihre spezielle Datenbank existieren könnten). Aber Zahlen können als Text bis zu mehreren tausend Ziffern gespeichert werden. Darüber hinaus können Sie CLOB-Felder verwenden, um Millionen von Ziffern zu speichern.

Es ist auch nichts wert, wenn Sie Sequenzen von Primzahlen speichern und Ihr Interesse an der Raumkompression dieser Sequenz besteht, könnten Sie damit beginnen, die Differenz zwischen einer Zahl und der nächsten statt der ganzen Zahl zu speichern.

    
___ answer1907448 ___

Sie könnten sie als Binärdaten speichern. Sie werden nicht direkt von der Datenbank lesbar sein, aber das sollte kein Problem sein.

    
___ qstntxt ___

Dieses Problem erschien mir ein bisschen merkwürdig. Ich bin gespannt, wie Sie eine Liste von Primzahlen in einer Datenbank darstellen können. Ich kenne keinen einzigen Datentyp, der eine große Anzahl von Primzahlen akurat und konsistent speichern könnte. Meine Sorge ist, dass, wenn die Primzahlen beginnen, Tausende von Ziffern zu enthalten, dass es ein bisschen schwierig sein könnte, sich auf die Datenbank zu beziehen. Gibt es eine Möglichkeit, eine große Menge von Primzahlen in einer Datenbank darzustellen? Ich bin mir ziemlich sicher, dass dieses Thema schon einmal angegangen wurde.

Eine Schwierigkeit, die es schwierig macht, ist, dass Primzahlen nicht in Faktoren zerlegt werden können. Wenn sie könnten, wäre dieses Problem viel einfacher.

    
___ answer1914781 ___

Wenn Sie Primzahlen wirklich als Zahlen und als eine Frage speichern wollen, stört Sie, dass "Primzahlen nicht in Faktoren zerlegt werden können". Es gibt noch eine andere Sache: Speichern Sie sie in der Liste des Moduls einer beliebigen nach Sequenz sortierten Zahl.

Kleines Beispiel:

%Vor%

Liste ist:

%Vor%

In der realen Anwendung ist es nützlich, durch den Modulus von 2 ^ 32 (32-Bit-Ganzzahlen) zu trennen, besonders wenn Primzahlen in der Verarbeitungsanwendung als Bytearrays gespeichert werden.

Speicherung in DB:

%Vor%

zum Beispiel oben einfügen (1647 ist nur Beispiel):

%Vor%

prime_id Wert kann von oracle sequence ...

zugewiesen werden %Vor%

Erhalte die ID der nächsten einzufügenden Primzahl:

%Vor%

Wählen Sie den Inhalt der Primzahl mit der angegebenen ID:

%Vor%     
___ answer1907341 ___

Dies ist ein wenig ineffizient, aber Sie könnten sie als Strings speichern.

    
___ qstnhdr ___ Speichern von großen Primzahlen in einer Datenbank ___ answer1908972 ___

Hier sind meine 2 Cent wert. Wenn Sie sie als Zahlen in einer Datenbank speichern möchten, sind Sie durch die maximale Größe der Ganzzahl eingeschränkt, die Ihre Datenbank verarbeiten kann. Sie möchten wahrscheinlich eine 2-Spalten-Tabelle mit der Primzahl in einer Spalte und der Sequenznummer in der anderen. Dann möchten Sie, dass einige Indizes die gespeicherten Werte schnell finden.

Aber Sie wollen das nicht wirklich tun, Sie wollen humongous (sp?) Primes weit über jeden Integer-Datentyp hinaus speichern, den Sie bisher haben. Und du sagst, dass du Strings ablehnst, also sind es binäre Daten für dich. (Es wäre für mich auch.) Ja, Sie könnten sie in einem BLOB in einer Datenbank speichern, aber welche Art von Einrichtungen wird das DBMS Ihnen bieten, um die n-te Primzahl zu finden oder die Primzahl einer Kandidaten-Ganzzahl zu überprüfen?

Wie entwerfe ich eine geeignete Dateistruktur? Das ist das Beste, was ich nach etwa 5 Minuten denken könnte:

  1. Setzen Sie einen Zähler auf 2.
  2. Schreibe die zwei Bits, die die erste Primzahl darstellen.
  3. Schreiben Sie sie erneut, um das Ende des Abschnitts mit den 2-Bit-Primzahlen zu markieren.
  4. Setzen Sie den Zähler auf counter + 1
  5. Schreiben Sie die 3-Bit-Primzahlen der Reihe nach. (Ich denke, es gibt zwei: 5 und 7)
  6. Schreiben Sie die letzte der 3-Bit-Primzahlen erneut, um das Ende des Abschnitts mit den 3-Bit-Primzahlen zu markieren.
  7. Geh zurück zu 4 und mach weiter mutatis mutandis.

Der Punkt über das Schreiben der letzten n-Bit-Primzahl zweimal ist es, Ihnen eine Möglichkeit zu geben, das Ende des Teils der Datei mit n-Bit-Primzahlen darin zu identifizieren, wenn Sie die Datei lesen.

Wenn Sie die Datei schreiben, möchten Sie wahrscheinlich auch die Offsets in die Dateien an verschiedenen Stellen notieren, vielleicht den Anfang jedes Abschnitts mit n-Bit-Primzahlen.

Ich denke, das würde funktionieren, und es würde Primzahlen bis zu 2 ^ verarbeiten (die größte vorzeichenlose Ganzzahl, die Sie darstellen können). Ich denke, es wäre einfach genug, Code zu finden, um einen 325467-Bit (say) -Wert in eine große ganze Zahl zu übersetzen.

Sicher, Sie könnten diese Datei als BLOB speichern, aber ich bin mir nicht sicher, warum Sie sich darum kümmern sollten.

    
___ answer1907440 ___

Wenn Sie keine Datenbank-basierten Berechnungen mit diesen Zahlen verwenden, speichern Sie sie einfach als Bitfolgen ihrer Binärdarstellung ( %code% , %code% etc.)

    
___ answer1908679 ___

Es hängt alles davon ab, welche Arten von Operationen Sie mit den Zahlen machen wollen. Wenn Sie nur speichern und suchen, verwenden Sie einfach Zeichenfolgen und verwenden Sie einen Check-Constraint / Domain-Datentyp, um zu erzwingen, dass es sich um Zahlen handelt. Wenn Sie mehr Kontrolle wünschen, können Sie mit PostgreSQL benutzerdefinierte Datentypen und Funktionen definieren. Sie können beispielsweise mit der GMP -Bibliothek eine Schnittstelle herstellen, um korrekte Ordnungen und Arithmetik für Ganzzahlen mit beliebiger Genauigkeit zu erhalten. Mit einer solchen Bibliothek können Sie sogar eine Prüfbedingung implementieren, die den Wahrscheinlichkeits-Primalitätstest verwendet, um zu überprüfen, ob die Zahlen wirklich Primzahlen sind.

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

    
___ answer1908396 ___

Ich denke, Sie verwenden am besten ein BLOB. Wie die Daten in Ihrem BLOB gespeichert werden, hängt von Ihrer beabsichtigten Verwendung der Nummern ab. Wenn Sie sie in Berechnungen verwenden möchten, müssen Sie eine Klasse oder einen Typ erstellen, um die Werte als eine Vielzahl von geordneten binären Werten zu speichern und sie als Zahlen usw. behandeln zu lassen. Wenn Sie sie nur dann anzeigen müssen sie als eine Folge von Zeichen zu speichern wäre ausreichend und würde die Notwendigkeit beseitigen, Ihre kalkulierbaren Werte in etwas anzeigbar zu machen, was für große Werte sehr zeitaufwendig sein kann.

Teilen und genießen.

    
___ tag123postgresql ___ PostgreSQL ist ein Open-Source-Objekt-relationales Datenbankmanagementsystem (ORDBMS), das für alle wichtigen Plattformen einschließlich Linux, UNIX, Windows und OS X verfügbar ist. Bitte geben Sie Ihre genaue Version von Postgres an, wenn Sie Fragen stellen. Fragen zur Administration oder erweiterten Funktionen richten Sie am besten auf dba.stackexchange.com. ___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ tag123database ___ Eine Datenbank ist eine organisierte Sammlung von Daten. Es ist die Sammlung von Schemas, Tabellen, Abfragen, Berichten, Ansichten und anderen Objekten. Die Daten sind typischerweise so organisiert, dass sie Aspekte der Realität so modellieren, dass sie Prozesse unterstützen, die Informationen benötigen. Verwenden Sie dieses Tag, wenn Sie Fragen zum Entwerfen einer Datenbank haben. Wenn es sich um ein bestimmtes Datenbankverwaltungssystem (z. B. MySQL) handelt, verwenden Sie stattdessen dieses Tag. ___ tag123primes ___ Primzahlen oder Primzahlen sind ganze Zahlen größer als 1, die nur durch sie und 1 teilbar sind, d. h. 2, 3, 5, 7, 11, .... ___ tag123oracle ___ Oracle Database ist ein Datenbankmanagementsystem mit mehreren Modellen, das von Oracle Corporation erstellt wurde. Verwenden Sie dieses Tag NICHT für andere Produkte von Oracle wie Java und MySQL. ___ answer1908657 ___

Wahrscheinlich nicht brilliant, aber was ist, wenn Sie sie in einer rekursiven Datenstruktur gespeichert haben? Sie könnten es als int speichern, als Exponent und als Verweis auf die niedrigeren Bitnummern.

Wie die String-Idee, wäre es wahrscheinlich nicht sehr gut für Speicherüberlegungen. Und die Abfragezeit würde aufgrund der rekursiven Natur der Abfrage erhöht werden.

    
___
Dan Williams 15.12.2009 13:23
quelle
3

Wenn Sie keine Datenbank-basierten Berechnungen mit diesen Zahlen verwenden, speichern Sie sie einfach als Bitfolgen ihrer Binärdarstellung ( BLOB , VARBINARY etc.)

    
Quassnoi 15.12.2009 13:24
quelle
3

Hier sind meine 2 Cent wert. Wenn Sie sie als Zahlen in einer Datenbank speichern möchten, sind Sie durch die maximale Größe der Ganzzahl eingeschränkt, die Ihre Datenbank verarbeiten kann. Sie möchten wahrscheinlich eine 2-Spalten-Tabelle mit der Primzahl in einer Spalte und der Sequenznummer in der anderen. Dann möchten Sie, dass einige Indizes die gespeicherten Werte schnell finden.

Aber Sie wollen das nicht wirklich tun, Sie wollen humongous (sp?) Primes weit über jeden Integer-Datentyp hinaus speichern, den Sie bisher haben. Und du sagst, dass du Strings ablehnst, also sind es binäre Daten für dich. (Es wäre für mich auch.) Ja, Sie könnten sie in einem BLOB in einer Datenbank speichern, aber welche Art von Einrichtungen wird das DBMS Ihnen bieten, um die n-te Primzahl zu finden oder die Primzahl einer Kandidaten-Ganzzahl zu überprüfen?

Wie entwerfe ich eine geeignete Dateistruktur? Das ist das Beste, was ich nach etwa 5 Minuten denken könnte:

  1. Setzen Sie einen Zähler auf 2.
  2. Schreibe die zwei Bits, die die erste Primzahl darstellen.
  3. Schreiben Sie sie erneut, um das Ende des Abschnitts mit den 2-Bit-Primzahlen zu markieren.
  4. Setzen Sie den Zähler auf counter + 1
  5. Schreiben Sie die 3-Bit-Primzahlen der Reihe nach. (Ich denke, es gibt zwei: 5 und 7)
  6. Schreiben Sie die letzte der 3-Bit-Primzahlen erneut, um das Ende des Abschnitts mit den 3-Bit-Primzahlen zu markieren.
  7. Geh zurück zu 4 und mach weiter mutatis mutandis.

Der Punkt über das Schreiben der letzten n-Bit-Primzahl zweimal ist es, Ihnen eine Möglichkeit zu geben, das Ende des Teils der Datei mit n-Bit-Primzahlen darin zu identifizieren, wenn Sie die Datei lesen.

Wenn Sie die Datei schreiben, möchten Sie wahrscheinlich auch die Offsets in die Dateien an verschiedenen Stellen notieren, vielleicht den Anfang jedes Abschnitts mit n-Bit-Primzahlen.

Ich denke, das würde funktionieren, und es würde Primzahlen bis zu 2 ^ verarbeiten (die größte vorzeichenlose Ganzzahl, die Sie darstellen können). Ich denke, es wäre einfach genug, Code zu finden, um einen 325467-Bit (say) -Wert in eine große ganze Zahl zu übersetzen.

Sicher, Sie könnten diese Datei als BLOB speichern, aber ich bin mir nicht sicher, warum Sie sich darum kümmern sollten.

    
High Performance Mark 15.12.2009 17:14
quelle
1

Es hängt alles davon ab, welche Arten von Operationen Sie mit den Zahlen machen wollen. Wenn Sie nur speichern und suchen, verwenden Sie einfach Zeichenfolgen und verwenden Sie einen Check-Constraint / Domain-Datentyp, um zu erzwingen, dass es sich um Zahlen handelt. Wenn Sie mehr Kontrolle wünschen, können Sie mit PostgreSQL benutzerdefinierte Datentypen und Funktionen definieren. Sie können beispielsweise mit der GMP -Bibliothek eine Schnittstelle herstellen, um korrekte Ordnungen und Arithmetik für Ganzzahlen mit beliebiger Genauigkeit zu erhalten. Mit einer solchen Bibliothek können Sie sogar eine Prüfbedingung implementieren, die den Wahrscheinlichkeits-Primalitätstest verwendet, um zu überprüfen, ob die Zahlen wirklich Primzahlen sind.

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

    
Ants Aasma 15.12.2009 16:34
quelle
0

Ich denke, Sie verwenden am besten ein BLOB. Wie die Daten in Ihrem BLOB gespeichert werden, hängt von Ihrer beabsichtigten Verwendung der Nummern ab. Wenn Sie sie in Berechnungen verwenden möchten, müssen Sie eine Klasse oder einen Typ erstellen, um die Werte als eine Vielzahl von geordneten binären Werten zu speichern und sie als Zahlen usw. behandeln zu lassen. Wenn Sie sie nur dann anzeigen müssen sie als eine Folge von Zeichen zu speichern wäre ausreichend und würde die Notwendigkeit beseitigen, Ihre kalkulierbaren Werte in etwas anzeigbar zu machen, was für große Werte sehr zeitaufwendig sein kann.

Teilen und genießen.

    
Bob Jarvis 15.12.2009 15:56
quelle
0

Wahrscheinlich nicht brilliant, aber was ist, wenn Sie sie in einer rekursiven Datenstruktur gespeichert haben? Sie könnten es als int speichern, als Exponent und als Verweis auf die niedrigeren Bitnummern.

Wie die String-Idee, wäre es wahrscheinlich nicht sehr gut für Speicherüberlegungen. Und die Abfragezeit würde aufgrund der rekursiven Natur der Abfrage erhöht werden.

    
LJM 15.12.2009 16:31
quelle