项目欧拉问题245

时间:2009-05-17 17:20:00

标签: python algorithm math

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

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

我们正在努力解决:

\frac{n-\phi(n)}{n-1}=\frac1k

\frac{n-1}{n-\phi(n)}=k

因此:

n\equiv1\ (\text{mod }n-\phi(n))

此时我认为真正了解这些数字的分布情况是个好主意。我一起攻击了一个蛮力程序,我用它来查找最多10个 4 的所有(复合)解决方案:

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小于问题所要求的10 11 限制。我发现的最有趣/最有用的一点是即使对于n的大值,k也很小。事实上,最大的k只有138.(另外,似乎k总是均匀。)

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

返回原始等式,请注意它可以重写为:

\frac{\phi(n)-1}{n-1}=\frac{k-1}k

因为我们知道k:

k\cdot\phi(n)\equiv k\ (\text{mod }n-1)

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

我几乎没有想法;任何人都可以泄露一些提示吗?


更新:许多人已经做了很多工作,我们一起能够证明一些事情。这是一个清单:

n总是奇数,k总是偶数。 k <= 10 5.5 。 n必须是无方形的。

我找到了当n = pq(2个素数因子)时p&gt; q的每个解。我使用了对于2个素数q = k +因子(k ^ 2-k + 1)和p = k + [k ^ 2-k + 1] /因子(k ^ 2-k + 1)的事实。我们也知道2个素数k&lt; q&lt; 2K。

对于具有2个更多素数因子的n,所有n个素数都大于k。

6 个答案:

答案 0 :(得分:9)

Project Euler并不喜欢在像StackOverflow这样的公共论坛上讨论问题。所有任务都是单独完成的,如果你遇到问题,你可能会为特定的数学或编程概念寻求帮助,但你不能只是决定如何解决手头的问题 - 取消项目Euler的观点。

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

答案 1 :(得分:5)

让我继续一下壶开始,但尝试一种不同的方法。再次目标是找到具有两个不同因子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小于10 11 的平方根。因此,有可能通过迭代10 11 的平方根下的所有素数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 :(得分:3)

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

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

这是N&lt; =(10 ^ 7):

的列表

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

答案 3 :(得分:1)

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

  1. 分析你通过蛮力产生的数字序列:它们都有一个共同的特征。如果你发现它是什么,那么你可能会有机会强行解决问题。

  2. 找到更复杂的保理算法。甚至更好:不是从数字中找出因素,而是从因子中建立数字......


  3. 编辑:您将找到的模式只会增加您的描述,并希望通过适当操纵分析表达式向您展示如何获得相同数量的知识。在不知道这种模式的情况下,我担心没有解决方案的途径。此外,这可能是最困难的项目Euler问题之一,所以你不必担心找到解决方案而不需要大量的汗水和辛劳......

答案 4 :(得分:1)

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

乐趣解决所有欧拉问题!

答案 5 :(得分:0)

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

我认为应该尝试将问题减少到

O(sqrt(n) http://www.texify.com/img/%5CLARGE%5C%21O%28%5Csqrt%7Bn%7D%29.gif

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

  • 任何解决方案必须是奇数
  • 任何解决方案必须是不同质数的倍数(不允许使用平方数因子)

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

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

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

在迭代范围0..sqrt(10 ^ 11)时,我将搜索迭代中作为解的数字的倍数。我将只讨论将平方根以下的数字乘以单个素数的情况。我将以这种方式得到的解决方案集将成为两个素数因子解决方案集的超集。它仍然不是完整的解集,如p1 * p2 * p3形式的解,其中p1p2,p2p3,p1p3> sqrt(10 ^ 11)将无法找到。

设b是平方根以下的数字和乘以它的素数。

b = kb*(b - phi(b)) + mb http://www.texify.com/img/%5CLARGE%5C%21b%20%3D%20k_%7Bb%7D%5Bb%20-%20%5Cphi%28b%29%5D%20%2B%20m_%7Bb%7D.gif

我们有:

ab = kb(ab - aphi(b)) + amb http://www.texify.com/img/%5CLARGE%5C%21ab%20%3D%20k_%7Bb%7D%5Bab%20-%20a%5Cphi%28b%29%5D%20%2B%20am_%7Bb%7D.gif

基于事实

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

我们有

ab = kb(ab - phi(ab)) - kbphi(b) + amb http://www.texify.com/img/%5CLARGE%5C%21ab%20%3D%20k_%7Bb%7D%5Bab%20-%20%5Cphi%28ab%29%5D%20-%20k_%7Bb%7D%5Cphi%28b%29%20%2B%20am_%7Bb%7D.gif

右侧的“模数”部分可写为:

m = amb - kbphi(b) = (a-1)mb - (kb-1)b http://www.texify.com/img/%5CLARGE%5C%21m%20%3D%20am_%7Bb%7D%20-%20k_%7Bb%7D%5Cphi%28b%29%20%3D%20%28a-1%29m_%7Bb%7D%20-%20%28k_%7Bb%7D-1%29b.gif

让我暂时接受

0 <= m <= ab - phi(ab) http://www.texify.com/img/%5CLARGE%5C%210%20%5Cleq%20m%20%5Cleq%20ab%20-%20%5Cphi%28ab%29.gif

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

(k-1)(ab - phi(ab)) <= m <= k(ab - phi(ab)) http://www.texify.com/img/%5CLARGE%5C%21%28k-1%29%28ab%20-%20%5Cphi%28ab%29%29%20%5Cleq%20m%20%5Cleq%20k%28ab%20-%20%5Cphi%28ab%29%29.gif

(k值必须以某种方式限制)或证明在那种情况下,b将是更高的b < sqrt(10 ^ 11)为此报道。

b prime或b复合有一种特殊情况,mb = 0.在这种情况下:

m = -(kb - 1)b http://www.texify.com/img/%5CLARGE%5C%21m%20%3D%20-%28k_%7Bb%7D%20-%201%29b.gif

这可以计算出来。对于b素数:

m = -(b-1)b http://www.texify.com/img/%5CLARGE%5C%21m%20%3D%20-%28b%20-%201%29b.gif

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

k(ab - (a-1)phi(b)) + m = 1, k = 1,2,... http://www.texify.com/img/%5CLARGE%5C%21k%5Bab%20-%20%28a-1%29%5Cphi%28b%29%5D%20%2B%20m%20%20%3D%201%2C%20k%20%3D%201%2C2%2C....gif

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

我需要解决:

k [3a-2(a-1)] - 6 = 1 =&gt; k(a + 2)= 5

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