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.
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%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.
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.
Sie könnten sie als Binärdaten speichern. Sie werden nicht direkt von der Datenbank lesbar sein, aber das sollte kein Problem sein.
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.
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%Dies ist ein wenig ineffizient, aber Sie könnten sie als Strings speichern.
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:
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.
Wenn Sie keine Datenbank-basierten Berechnungen mit diesen Zahlen verwenden, speichern Sie sie einfach als Bitfolgen ihrer Binärdarstellung ( %code% , %code% etc.)
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.
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.
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.
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:
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.
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.
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.
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.
Tags und Links mysql database oracle postgresql primes