假设gcd(e,m)= g。求整数d使得(e x d)= g mod m 其中m和e大于或等于1.
以下问题似乎可以用代数方法解决,但我已经尝试过这样做,它给了我一个整数。有时,d的解是整数,有时它不是。我该如何处理这个问题?
答案 0 :(得分:0)
d可以用扩展的euklidean算法计算,参见例如这里: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm 该页面上的a,b是你的e,m,你的d将是x。
答案 1 :(得分:0)
也许您假设e
和m
都是整数,但问题是它们是非整数?当e
和m
都是整数时,只有一种情况会给出整数解。
为什么严格整数输出不是一个合理的结果e
!= m
:
当你看到像3/7
这样的分数时,并将其分母称为分子的“除数”,从经典的数学角度来看,这是一个松散的意义。当你谈到gcd(最大公约数)时,“d”指的是一个整数,它将均衡分子(整数),产生另一个整数:4
是8
的除数,因为8/4 = 2
和2
是一个整数。计算机科学或离散数学视角可能将除数定义为d
的数字,当我们采用a
(0
时,对于给定数字a % d
给出a mod d
离散数学)。你能看出除数的绝对值不能超过分子的绝对值吗?如果确实如此,你会得到一些馅饼,而不是整个馅饼 - 例如:
4 % a = 0
(Z是整数集)a in Z
(在数学符号中,该集合为:while |a| <= 4
),但
{a ∈ Z : |a| <= 4}
的 4 % a != 0
(数学:a in Z while |a| > 4
),因为当我们将{a ∈ Z : |a| > 4}
除以比4
更大的东西时,我们得到分数(即5
时的|4/a| < 1
。不要太担心绝对价值的东西,如果它会把你抛弃 - 因为它们也是整数,所以要考虑使用负数。
因此,即使任何给定整数的“最大”除数也小于整数。否则它不是除数(见上文,或Wikipedia on divisors)。
查看|a| > 4
:
gcd(e, m) = g
(数学人%
)的定义,对于任意两个数字mod
和number1
,number2
永远不会生成number1 % number2
}更大:number1
。
number1 % number2 <= number1
- &gt; (e * d) = g % m
(e * d) <= g
和e
的除数:m
。g <= e, m
,知道(e * d) <= g such that d, g are both integers
g <= e
以后g
是[{1}}的除数,我们必须将左侧缩小以匹配e
。如果另一个多重项是g
或分数,则只能使用乘法使整数更小。问题指出0
是一个整数,所以我们有一个案例可行 - d
案例 - 和无数多个产生矛盾 - 与d = 0
,e
相矛盾,和m
都是整数。 如果d
== e
:
这是m
案例:
d = 0
,则e == m
- 示例:gcd(e, m) = e = m
和3
的最大公约数为3
3
为(e * d) = g % m
且(e * d) = m % m
因此m % m = 0
暗示(e * d) = 0
当d = 0
或d
中的任何一个可能是非整数时,如何编码将找到e
的函数:
许多除数问题都是迭代完成的,比如“找到gcd”或“找到素数”。这部分是因为这些问题严格处理整数,countable。出现此问题,我们需要允许m
或e
为非整数,以便为m
以外的案例提供解决方案。但是,有理数的集合是不可数的,因此迭代解决方案最终会使程序崩溃。有了这个问题,你真的只想要一个公式,可能还有一些案例。您可以这样设置:
e = m
<强>最后:强>
根据您对此问题的处理方式,另一件可能有用的事情是,右侧始终是If e == m
return 0 # since (e * d) = m % m -> d = 0
Else
return g / e
或g
,因为0
来自g <= m
{1}}是g
的除数(参见上面的所有内容)。在m
,g < m
的情况下。在g % m = g
,g == m
。
带有欧几里得算法维基百科页面链接的@asp答案很好。
关于尝试使用数学特定版本的StackOverflow的@aidenhjj评论很好。
如果这是针对数学课程且您不习惯编码:g % m = 0
,<=
,>=
和==
是计算机代表的, ≥,“相等”,“不等于”。