在数据库中存储大素数
-
19-09-2019 - |
题
这个问题让我觉得有点奇怪。我很好奇如何在数据库中表示素数列表。我不知道有哪种数据类型能够准确且一致地存储大量素数。我担心的是,当素数开始包含数千位数字时,从数据库中引用可能会有点困难。有没有办法在数据库中表示大量素数?我很确定以前已经讨论过这个话题。
造成这一问题的困难之一是素数不能分解为因数。如果他们可以的话,这个问题就会容易得多。
解决方案
如果你真的想存储素数数字和的问题之一,停止你的是“质数不能被分解成因素”外,还有另一件事:它存储在由顺序排列的任何数量的模量的列表。
小示例:
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
其他提示
您可以将它们保存为二进制数据。他们不会从数据库中人类可读的直线,但不应该是一个问题。
数据库(取决于哪个)可以常规存储号码可达38-39位准确。这让你相当远。
除此之外,你不会对他们(精确)数据库中(不包括可能存在于您的特定数据库的任意精度的模块)做算术运算。但是号码可以存储为文本可达几千位。除此之外,您可以使用CLOB类型字段存储的数字百万。
此外,它没有价值,如果你存储素数的序列和你的兴趣是按照这个顺序,你可以通过存储一个序号,下一个,而不是整个数之差开始的空间压缩。
这是有点低效率的,但你可以将它们存储为字符串。
如果您不打算使用的数据库端计算与这些数字,只是将它们存储为它们的二进制表示的比特序列(BLOB
,VARBINARY
等)
这是我的 2 美分价值。如果您想将它们作为数字存储在数据库中,那么您将受到数据库可以处理的最大整数大小的限制。您可能需要一个 2 列的表,其中一列是素数,另一列是序号。然后您需要一些索引来快速查找存储的值。
但你并不是真的想这样做,对吗?你想存储巨大的(sp?)素数,远远超出你所拥有的任何整数数据类型。你说你不喜欢字符串,所以它对你来说是二进制数据。(这也适合我。)是的,您可以将它们存储在数据库中的 BLOB 中,但是 DBMS 将为您提供什么类型的工具来查找第 n 个素数或检查候选整数的素数?
如何设计合适的文件结构?这是我思考了大约 5 分钟后能想到的最好的结果:
- 将计数器设置为 2。
- 写入代表第一个素数的两位。
- 再次写入它们,以标记包含 2 位素数的部分的结尾。
- 将计数器设置为 counter+1
- 按顺序写出 3 位素数。(我认为有两个:5 和 7)
- 再次写入最后一个 3 位素数,以标记包含 3 位素数的部分的结尾。
- 返回4并进行必要的必要修改。
将最后一个 n 位素数写入两次的目的是为您提供一种方法,以便在您读取文件时识别文件中包含 n 位素数的部分的末尾。
当您编写文件时,您可能还需要记下文件中各个点的偏移量,也许是包含 n 位素数的每个部分的开头。
我认为这可行,并且它可以处理最多 2^(可以表示的最大无符号整数)的素数。我想很容易找到将 325467 位(比如说)值转换为大整数的代码。
当然,您可以将此文件存储为 BLOB,但我不确定您为什么要麻烦。
我觉得你最好使用BLOB。如何将数据存储在您的BLOB取决于你的使用目的的数字。如果你想在计算中使用他们,我认为你需要创建一个类或类型的值存储为一些品种有序二进制值,并允许它们被处理为数字,等等。如果你只是想显示他们,那么它们存储作为一个字符序列就足够了,并且将不再需要你的可计算的值转换为可显示的东西,这是非常耗时的大值。
共享和欣赏。
也许并不光彩,但如果你将它们存储在一些递归数据结构是什么。你可以将其存储为一个int,它的指数,并于低位数的参考。
像串的想法,它可能不会是内存的考虑非常好。和查询时间将增加,由于该查询的递归性质。