【问题标题】:Project Euler Problem 245欧拉计划问题 245
【发布时间】:2009-05-17 17:20:00
【问题描述】:

我现在使用problem 245,但遇到了一些问题。我已经做了一些工作,但我觉得我没有采取任何真正的步骤来解决它。到目前为止,这是我所得到的:

我们需要找到 n=ab 和 a 和 b 正整数。我们也可以假设 gcd(a, b) = 1 而不会失去一般性,因此 phi(n) = phi(ab) = phi(a)phi(b)。

我们正在努力解决:

因此:

此时,我认为实际查看这些数字的分布情况是个好主意。我破解了一个蛮力程序,我用它来找到所有(复合)解决方案,最多 104

15, 85, 255, 259, 391, 589, 1111, 3193, 4171, 4369, 12361, 17473, 21845, 25429, 28243, 47989, 52537, 65535, 65641, 68377, 83767, 91759

重要的是,won't be too many 似乎小于问题要求的 1011 限制。我发现的最有趣/最有用的一点是,即使 n 的值很大,k 也非常小。实际上最大的k只有138。(另外,似乎k总是偶数。)

考虑到这一点,我猜想可以考虑 k 的每个值,并找出 n 与 k 的值对应的值。

回到原来的方程,注意可以改写为:

因为我们知道k:

这就是我所知道的;我仍在追求我的一些路线,但我想知道我是否错过了重点!通过蛮力方法,我发现总和高达 108,即 5699973227(n 只有 237 个解决方案)。

我几乎没有想法;谁能给出一些提示?


更新:很多人已经完成了很多工作,我们一起能够证明几件事。这是一个列表:

n 总是奇数,k 总是偶数。 k 5.5。 n 必须是无平方的。

我已经找到了当 n=pq(2 个素因数)和 p>q 时的所有解决方案。我使用了对于 2 个素数 q = k+factor(k^2-k+1) 和 p = k+[k^2-k+1]/factor(k^2-k+1) 的事实。我们还知道 2 个素数 k

对于具有 2 个以上素数的 n,n 的所有素数都大于 k。

【问题讨论】:

  • 如果您不知道术语,这个欧拉问题会令人困惑;它们在 #243 中有更好的定义:projecteuler.net/index.php?section=problems&id=243.
  • 我发布的链接中提供了所有相关信息。从字面上看,问题是:找到所有整数 1
  • 我已经能够弄清楚一点:k must 除 n-1 (通过操作你的第一个方程得到这个,所以有一个像 (n-1 )/k 在一个全整数表达式中),k not (必然)除 phi(n) (你的蛮力列表中的反例),并且 n 必须是奇数(因此 k 偶数)(很容易证明 (k-1)n = k phi(n) - 1;考虑这个表达式 mod 2 并记住/证明 phi(n) 对于 n > 2 总是偶数。我不知道从那里去哪里,而这就是我现在必须腾出的所有时间。
  • 我认为讨论堆栈溢出不符合欧拉项目的精神;)
  • 我仔细检查了我在上面发布的内容,它是正确的。您用来解决同一问题的方程式可能正确也可能不正确,我还无法检查。其他一些你可能会或可能不会觉得有用的东西:我证明了 k 和 phi(n) 是彼此的模逆,mod n。这是从 (k-1)n = k phi(n) - 1 得出的另一个结果。

标签: python algorithm math


【解决方案1】:

Project Euler 不喜欢在 StackOverflow 等公共论坛上讨论问题。所有任务都是单独完成的,如果您遇到问题,您可能会就特定的数学或编程概念寻求帮助,但您不能只决定问如何解决手头的问题——这会带走 Euler 项目的意义。

重点是自己学习并提出解决方案,并学习新概念。

【讨论】:

  • 来自主页:“鼓励利用互联网研究问题,因为在许多问题的表面之下可能隐藏着数学宝藏。”跨度>
  • 当你已经尝试过并且在一个问题上花费了很多精力时,正如 PythonPower 显然所做的那样,继续用头撞墙是没有意义的——你达到了一个阶段,当有没有更多的东西你可以自己学习。那时,明智的做法是寻求帮助并寻求学习,而不是放弃。 :P
  • 鼓励研究,而不是寻求解决难题的方法。我的意思是对我来说,我看到的更多,就像您通过阅读意识到某个问题需要了解贝叶斯定律一样,因此您要求人们帮助实施贝叶斯分类程序,而不是寻求整个难题的解决方案。
  • 而研究正是他正在做的事情。他展示了他的工作,跟进了每一个暗示和猜测,并证明/反驳了它。在寻求帮助之前(或什至之后),您还希望有人做什么?一个人如何在不遇到新概念的情况下“学习新概念”?
【解决方案2】:

让我继续罐头的开始,但尝试一种不同的方法。目标再次是找到具有两个不同因子 n=pq 的数字。正如您已经指出的那样,我们正在寻找 n-phi(n) 除以 n-1 的数字。即,如果 n=pq 那么这意味着我们正在寻找 p,q 使得

  p+q-1 divides pq-1

假设我们固定 p 并且正在寻找满足上述等式的所有素数 q。上面的方程看起来不太容易求解,因此下一步是尽可能地消除 q。特别是,我们使用如果 a 整除 b 那么 a 也整除 b + ka 对于任何整数 k。因此

  p+q-1 divides pq - 1 - p(p+q-1)

并简化这导致条件

  p+q-1 divides p^2 - p + 1.

我们可以假设 p 是 n 中较小的素因子。那么 p 小于 1011 的平方根。因此,可以通过遍历 1011 平方根以下的所有素数 p 来找到具有两个因子的所有数字,然后找到 p^2-p+1 的除数,求解 q 并检查如果 q 是素数并且 pq 是问题的解。

当然,这仍然使整数具有两个以上的质因数。在这里也有一种类似的方法,但涉及更多,需要进一步优化。

我无法回答的一个问题是,为什么这个问题的表述如此复杂。难道作者不能只要求 n-phi(n) 除以 n-1 的复合整数的总和。所以也许我在那里错过了一个重要的提示。


现在,具有两个素因子的解是已知的,我将尝试找到一种潜在的算法来找到具有超过 2 个素因子的解。目标是找到一个算法,给定一个复合整数 m 找到所有素数 q,使得 mq 是一个解决方案。即,q 必须是这样的

  mq - phi(mq) divides mq - 1.

  F = mq - phi(mq).

那当然

  F = (m-phi(m)) q + phi(m).

在两个素因数的情况下,可以通过从上面等式的左侧消除 q 来找到 F 的条件。因为 F 整除 mq-1 它也整除

  (m-phi(m))(mq - 1) 

因此也是

  m F - (m-phi(m))(mq - 1)  = m phi(m) + m - phi(m).

因此,通过找到 m phi(m) + m - phi(m) 的所有除数 F 并检查是否 (F - phi(m))/(m - phi(m)) 是素数,可以找到给定 m 的所有解 mq。 因为只有除数 F 满足

 F == phi(m) (mod m - phi(m))

可以导致新的解决方案,这个事实有时可以用来优化分解 m phi(m) + m - phi(m)。

【讨论】:

  • 我并没有那样做,但我已经找到了所有的 2-prime 解决方案。至于复杂的问题;我认为这适用于很多问题,例如 241,其中包含不相关的信息!
  • 可爱的作品。那肯定越来越近了。但是,像 3902867 = 53x211x349 这样的数字仍然无法找到。那是因为没有任何合数可以通过素数扩展来实现。
  • 并非如此。使用 m = 53*211 作为输入,我的程序确实找到了 q = 349。虽然问题是找到一个好的标准来选择需要测试的 m 的值。例如。如果 m 和 phi(m) 不是互质的,则无需测试它们。我可以假设 q 是最大的素因子,因此我不需要测试所有 m 直到 10^11,但它仍然可能是一个很大的数字。
  • 好点鹰科!我找到了所有 2 素数的解决方案,所以让我们假设 m = pq (p pq^2
  • 其实 10^11 > n = pqr > p^3 的意思是 p 那个 小,但可以工作。在我看来,真正的问题是 m phi(m) + m - phi(m) 太大而无法分解。
【解决方案3】:

质数相乘。我所做的是首先检查每个 2-prime 产品;存储那些是成功的。然后使用存储的产品,检查那些有更多素数的产品(你的蛮力中显示的每个 3 素数产品都有一个 2 素数子集有效)。使用这些存储的产品,然后用 4 个素数、5 个素数等再试一次。

唯一的缺点是你需要一个好的筛子或素数列表。

这是 N

2 个素数 15,85,259,391,589,1111,3193,4171,4369,12361,17473,25429,28243,47989,52537,65641, 68377,83767,91759,100777,120019,144097,186367,268321,286357,291919,316171,327937 ,346063,353029,360301,404797,406867,524851,531721,558013,563767,633727,705667,73 8607,910489,970141,1013539,1080769,1093987,1184233,1185421,1223869,1233823,12618 07,1264693,1455889,1487371,1529641,1574383,1612381,1617379,1657531,1793689,20163 79,2095087,2130871,2214031,2299459,2500681,2553709,2609689,2617963,2763697,30475 21,3146677,3397651,3514603,3539017,3820909,3961219,4078927,4186993,4197901,44997 07,4552411,4935883,4975687,5103841,5299351,5729257,5829877,5864581,6017299,62364 01,6802531,6856609,8759011,9059233,9203377,9301603,9305311,9526747,9536899,95832 79,9782347,9900217 3 个素数 255,21845,335923,3817309 4 个素数 65535 5 个素数 83623935

【讨论】:

  • 我能看到的唯一问题是计算所有 2-prime 产品。但是,可以证明如果 n=pq 则 (pq-1)/(p+q-1) = k 我可以研究。非常感谢!
  • 好的,我试过你说的,但是找不到像 3902867 = 53x211x349 这样的数字。但是,我可以将用于查找 2 素数的方法扩展到查找更多素数 - 我会试一试。
【解决方案4】:

为了不放弃太多,我建议两件事:

  1. 分析您通过蛮力生成的数字序列:它们都有一个共同特征。如果你找到它是什么,那么你可能会尝试暴力破解你的解决方案。

  2. 找到更复杂的因式分解算法。甚至更好:与其从数字中找到因子,不如从因子中构建数字...


编辑:您将找到的模式只会增加您的理解力,并希望向您展示如何通过充分操纵分析表达式来获得相同数量的知识。在不知道这种模式的情况下,恐怕没有解决办法。另外,这可能是最难的 Project Euler 问题之一,因此您不必担心无需大量汗水和辛劳就能找到解决方案...

【讨论】:

  • 1.不理想,因为我正在寻找理解而不是幸运的猜测!
  • 2.更多的是我想做但做不到的事情。
【解决方案5】:

对这个问题没有直接帮助,但可能对未来的数学项目很感兴趣:我建议在 research.att.com 上使用 "The On-Line Encyclopedia of Integer Sequences",而不是使用 WolframAlpha 来分析序列。

玩得开心解决所有欧拉问题!

【讨论】:

  • OEIS 已移动。该链接不再起作用。立即使用此链接:oeis.org/A160599
【解决方案6】:

我还没有找到完整的解决方案,但我想分享一下我的想法。也许有人可以帮忙。

我认为应该尽量减少问题


(来源:texify.com

复杂性。以下事实可用于使搜索更有效:

  • 任何解都必须是奇数
  • 任何解都必须是不同素数的倍数(不允许平方数因数)

其他人已经指出了这些,并且很容易仅使用 totient 函数的基本属性来证明它们。

我将从分析直到 sqrt(10^11) 的所有素数和合数开始。这不是一项大任务,所需时间应远低于 1 分钟的要求。平方根以上的所有解的形式为:

a*b, where at least one of a,b < sqrt(10^11)

在迭代范围 0..sqrt(10^11) 时,我将在迭代中搜索作为解的数字的倍数。我只会介绍将平方根以下的数字与单个素数相乘的情况。我将以这种方式获得的解决方案集将是二素因子解决方案集的超集。它仍然不是完整的解决方案集,因为 p1p2p3 形式的解决方案,其中 p1p2,p2p3,p1p3>sqrt(10^11) 将找不到。

设 b 是平方根以下的数,a 是乘以它的素数。


(来源:texify.com

我们有:


(来源:texify.com

基于事实

phi(a) = a - 1 and phi(a)*phi(b) = phi(a*b) if a, b coprime

我们有


(来源:texify.com

右边的“取模”部分可以写成:


(来源:texify.com

让我暂时接受


(来源:texify.com

然后我可以为 a (m=1) 求解上述方程,验证结果是否为素数,然后我将得到唯一的解,它是 b 的倍数。如果 m 不在实际模数的范围内,那么我需要求解不同 k 值的方程:


(来源:texify.com

(k 值必须以某种方式受到限制)或证明在这种情况下将是一个更高的 b

对于 b 素数或 b 复合并且 mb = 0 有一个特殊情况。在这种情况下:


(来源:texify.com

这是可以计算出来的。对于 b 一个素数:


(来源:texify.com

我需要找到一个满足等式的素数 a:


(来源:texify.com

例如,设 b=3,phi(b)=2。

我需要解决:

k[3a-2(a-1)] - 6 = 1 => k(a + 2) = 5

对于k=1,a=7,素数(解) 对于所有其他的 k 值,上述等式都不能满足。

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多