- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正尝试在 MATLAB 中编写一个程序来检查数字是否为 n
是否为素数。对于初学者,我正在实现 Fermat Primality Test .
费马指出对于一个素数 p
和 1 <= b < p
:
b^(p-1) = 1 (mod p)
所以在 MATLAB 中使用 p = 17
, 和 b = 11
>> mod(b^(p-1),p)
或
>> rem(b^(p-1),p)
我遇到的问题是,对于这个实例,MATLAB 返回 0
.但是,如果 p
是素数,它应该返回 1
.我看不到我遗漏了什么,所以非常感谢任何帮助!
最佳答案
@James 给出了正确的解释,我只是想再扩展一点。
您在 double-precision floating-point format 中看到,[2^52,2^53]
范围内的整数是可精确表示的(那是因为小数部分有 52+1 位)。在下一个范围 [2^53,2^54]
中,可表示的整数是偶数(前一个范围乘以二)。以此类推,每次我们走得更高时,间距都会加倍。
不幸的是,数字 11^16
(等于 45949729863572161
)不能用 double 精确表示。事实上,围绕那个数字的可表示数字列表是:
45949729863572144
45949729863572152
45949729863572160
45949729863572168
45949729863572176
根据舍入模式,45949729863572161
将近似为最接近的可表示数字,在本例中为 45949729863572160
。
要了解发生了什么,让我们尝试存储数字 45949729863572100 + [44:76]
并显示结果:
% build a cell array of strings containing the numbers, then convert to doubles
% (you could also enter the numbers as literals directly)
str = cellstr(num2str((44:76)', '459497298635721%d'));
num = str2double(str);
% print the original number, its stored value (in decimal and hex notations)
for i=1:numel(num)
fprintf('%s %17.0f %bX\n', str{i}, num(i), num(i));
end
这是输出(带有一些注释):
actual stored stored in HEX
----------------------------------------------------
45949729863572144 45949729863572144 436467E125C16356 % exact representation
45949729863572145 45949729863572144 436467E125C16356
45949729863572146 45949729863572144 436467E125C16356
45949729863572147 45949729863572144 436467E125C16356
45949729863572148 45949729863572144 436467E125C16356
45949729863572149 45949729863572152 436467E125C16357
45949729863572150 45949729863572152 436467E125C16357
45949729863572151 45949729863572152 436467E125C16357
45949729863572152 45949729863572152 436467E125C16357 % exact representation
45949729863572153 45949729863572152 436467E125C16357
45949729863572154 45949729863572152 436467E125C16357
45949729863572155 45949729863572152 436467E125C16357
45949729863572156 45949729863572160 436467E125C16358
45949729863572157 45949729863572160 436467E125C16358
45949729863572158 45949729863572160 436467E125C16358
45949729863572159 45949729863572160 436467E125C16358
45949729863572160 45949729863572160 436467E125C16358 % exact representation
45949729863572161 45949729863572160 436467E125C16358
45949729863572162 45949729863572160 436467E125C16358
45949729863572163 45949729863572160 436467E125C16358
45949729863572164 45949729863572160 436467E125C16358
45949729863572165 45949729863572168 436467E125C16359
45949729863572166 45949729863572168 436467E125C16359
45949729863572167 45949729863572168 436467E125C16359
45949729863572168 45949729863572168 436467E125C16359 % exact representation
45949729863572169 45949729863572168 436467E125C16359
45949729863572170 45949729863572168 436467E125C16359
45949729863572171 45949729863572168 436467E125C16359
45949729863572172 45949729863572176 436467E125C1635A
45949729863572173 45949729863572176 436467E125C1635A
45949729863572174 45949729863572176 436467E125C1635A
45949729863572175 45949729863572176 436467E125C1635A
45949729863572176 45949729863572176 436467E125C1635A % exact representation
如您所见,xxx44
和 xxx52
之间不能有数字(因为它们的 HEX 表示仅在最后一位不同)。介于两者之间的任何东西都必须近似为最接近的可表示数字。所以范围一分为二,一半分配给下限,另一半分配给上限(注意中间有7个数字,所以中间一个是特例,分配给上限/下限以交替方式边界)。
因此,输入 45949729863572156
和 45949729863572164
之间的任何数字(包括 11^16
)实际上将存储 double 值 45949729863572160
.
现在其他人建议使用 bignum库以避免这些数字限制(来自 MathWorks 的 Symbolic Math Toolbox,John D'Errico 的 VPI 或 HPF,或文件交换中可用的其他解决方案之一......)。例如:
>> b = sym(11); % Symbolic Math Toolbox
>> b^16
ans =
45949729863572161
>> mod(b^16,17)
ans =
1
但是,在您的情况下,uint64
能够准确地存储这些数字:
>> b = uint64(11); p = uint64(17);
>> b^(p-1)
ans =
45949729863572161
>> mod(b^(p-1),p)
ans =
1
请记住:
>> intmax('uint64')
ans =
18446744073709551615
关于matlab - 费马小定理在 MATLAB 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247026/
所以,我看过一个关于 TDD 的视频,其中演示者说,你应该只对类的一部分进行单元测试,即为外部世界提供一些东西。他提到这很好,因为这种方法可以确保类遵守“契约(Contract)”,因此它履行了其职责
在CAP定理中,Redis被指定为缺乏可用性(具有分区容错性和一致性)的数据库。 但是在很多地方,Redis 被认为是一种高可用的键值存储。 什么是对的?如果您能提供深入的答案,我将不胜感激。 最佳答
我正在尝试证明以下内容: 1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1 1-pow {zero} = refl 1-pow {suc x} = {!!} 我是 Adga 的新手,甚
我正在努力解决这个问题 - 我实际上已经找了一整天了! 我想我理解它背后的主要概念,但我正在努力弄清楚创建将形状投影到其上的 Axis 所需的数学? 因此,如果我有一个矩形,我会找出每个点,然后使用它
我试图证明以下内容: 1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1 1-pow {zero} = refl 1-pow {suc x} = {!!} 我是 Adga 的新手,甚至不
所以我想计算任何给定三角形内的点数。我知道我必须使用 Pick 定理,但我的代码最终变得非常长,其中包含用于测试每种情况的 if-else if 语句的数量。我一直以此为指导 How many int
当说系统是 CP(一致性和分区)时,这是否意味着我们不能在复制的数据节点之间使用异步同步,并且每次写入都必须同步(甚至是事务性)复制? 据我了解,一致性意味着对于每次写入,后续读取(来自任何节点)都将
虽然我试图理解CAP中的“可用性”(A)和“分区容忍度”(P),但我发现很难理解各种文章的解释。 我感觉 A 和 P 可以走到一起(我知道事实并非如此,这就是我无法理解的原因!)。 深入浅出,A和P是
foundationdb 声明在 consistency 上吗?有效的? FoundationDB provides the strongest possible consistency model,
Azure 本身是 PaaS,而不是 IaaS。你同意? MS保证99%的可用性和强一致性。您可以在此处找到 MS SLA:http://www.microsoft.com/windowsazure/
我正试图掌握 Python 的 fft 功能,我偶然发现的一件奇怪的事情是 Parseval's theorem似乎不适用,因为它现在给出了大约 50 的差异,而它应该是 0。 import nump
我正在尝试在 Coq 中进行证明,并且我想使用我已经定义和证明的引理。以下代码可以吗? Lemma conj_comm: forall A B : Prop, A /\ B -> B /\ A. Pr
我试图通过 Isabelle(定理证明者)的 Isar 章节,第一个陈述是: lemma "¬ surj(f :: 'a ⇒ 'a set)" 我想了解什么是常数surj曾是。我知道查找定理很容易:
我想在分布式系统中使用 aerospike。 Aerospike 官方文档说: Aerospike 系统被归类为 AP 任何人都可以照亮它吗? Aerospike如何保证分布式环境下的AP模式。 最佳
这code example to generate a list of definitions对我有用,但只适用于一个索引列表。每当我尝试添加另一个列表(例如,对于定理)时,只有在设置垃圾中最后定义的
我打算使用 memcached 数据库。根据我的要求,高性能(速度)和可用性是最高优先级的。(一致性可以在某种程度上进行交易)请建议使用合适的数据库。 我正在关注 CAP Theorem . 按类别我
根据 CAP Consistency - All nodes gave the same data Availability means the ability to access the clust
如果我正确理解了 CAP 定理,可用性意味着即使节点出现故障,集群也会继续运行。 我见过很多人(http://blog.nahurst.com/tag/guide)将RDBMS列为CA,但我不明白RB
根据我目前所读到的有关 CAP 定理的所有内容,没有分布式系统可以同时提供这三者:可用性、一致性和分区容错性。 现在,Hadoop 2.x 引入了一项新功能,可以对其进行配置以消除 hadoop 集群
目前,我正在考虑拍摄图像及其光谱。现在 Parceval 的定理说两者应该具有相等的能量。然而,当我尝试在某些图像上对此进行测试时,numpy 真实 FFT 函数似乎并非如此。 这是我用于测试的代码:
我是一名优秀的程序员,十分优秀!