【问题标题】:programming mathematica to find a specific perfect square number set编程mathematica以找到特定的完美平方数集
【发布时间】:2018-12-02 11:41:45
【问题描述】:

我的一位同事在他的 C 编程课上提出了以下问题,我觉得这很有趣。它可以很容易地用任何编程语言完成,我立刻想到了 wolfram。 问题是这样的:

数字25是一个唯一的完美正方形,如果我们将每个数字加一,它就变成了36,这也是一个完美的正方形! 编写一个程序来找到另一组具有相同性质的数字。

我相信这可以在mathematica 中轻松完成。 有人可以解释我如何在数学中做到这一点。请注意问题的原因只是让我进入我一无所知的数学编程的借口。

谢谢大家。

【问题讨论】:

  • Mathematica 是一个交互式系统,并且有大量文档,尤其是对于基本功能。打开笔记本,开始玩。弄清楚如何将1 添加到两位数的每个数字,弄清楚如何找到整数的平方根。停下来,想一想,继续 3 位数的数字。停下来,再想一想,阅读有关简单函数定义的文档。现在您已将脚趾浸入 Mathematica 的海洋。
  • 谢谢马克。我想我会淹死在那片“海洋”中!哈哈..:)
  • 这个问题在另一个基础上得到了很好的扩展。

标签: wolfram-mathematica


【解决方案1】:

更实用的解决方案。

Table[x^2, {x, 1, 100}] // Select[IntegerQ[Sqrt[FromDigits[IntegerDigits[#] + 1]]] &]

数字9应该如何处理?

IntegerDigits[19]
(* {1, 9} *)

IntegerDigits[19] + 1
(* {2, 10} *)

FromDigits[IntegerDigits[19] + 1]
(* 30 *)

应该 +1 进位所以结果数是 20 而不是 30?

【讨论】:

    【解决方案2】:

    您可以轻松地将其扩展到任何基数,您只需要知道该数字在给定基数中的长度。我的意思是以下。假设以 10 为底,数字是 25。为了验证前提,我们需要加 11。但 11 无非是:

    25 + 11
    = 25 + 10^1 + 10^0
    = 25 + (10^2-1)/(10-1)
    = 36 = 6^2
    

    现在想象数字 72 × 72 = 5184,但以基数 3 表示(518410 = 210100003 em>)。现在以 3 为底进行计算,得到

    21010000 + 11111111
    = 21010000 + 3^7 + 3^6 + 3^5 + 3^4 + 3^3 + 3^2 + 3^1 + 3^0
    = 21010000 + (3^8-1)/(3-1)
    = 102121111 = 10102^2
    

    其中1021211113 = 846410 = 9210 × 9210 .

    如您所见,您需要做的就是将数字 (bn - 1)/(b-1) 添加到数字并检查它是否是一个正方形。这里的n,表示以b为底的数x的总位数。

    使用简单的查找表,您可以在 Mathematica 中执行以下操作:

    b = 10 
    x = Table[n^2, {n, 1, 1000}];
    Select[x, MemberQ[x, # + (b^IntegerLength[#, b] - 1)/(b - 1)] &];
    {25, 289, 2025, 13225, 100489, 198025, 319225, 466489}
    

    那么从 2 到 10 的完整列表是:

    Table[Select[x, MemberQ[x, # + (b^IntegerLength[#, b] - 1)/(b - 1)] &], {b, 2, 10}]
    

    【讨论】:

    • 赞成。很好的洞察力。有一个小错字。 BaseForm[5184, 3] = 21010000,不是21001200
    【解决方案3】:

    与其把你扔进大海,不如让你先在泳池的浅水区划船。

    n=1;
    While[n<100,
      d=IntegerDigits[n];(*get the list of digits making up n*)
      newd=d+1;(*add one to every element of the list giving a new list*)
      newn=FromDigits[newd];(*turn that new list of digits back into a number*)
      If[IntegerQ[Sqrt[newn]],Print[{n,newn}]];
      n++
    ]
    

    这不仅查看 n 的平方值,而且可能会为您提供有关如何增加数字和测试平方结果所需的提示。

    在 Mathematica 中,做任何事情总是至少有十几种不同的方式,并且一些文化围绕着使程序尽可能简短,并且可能具有隐秘性。你可以稍后开始捡起来。开始使用新语言时,简单性似乎更好。

    希望你玩得开心。

    【讨论】:

    • 我已经和一些鲨鱼一起游泳了..我使用了一个 for 循环并在 result=N[ Sqrt[i] ] 之间的某个地方堆叠。即使 square 是 Int 也给了我错误 :) 我什至修复了您的 IF 语句 :) 它需要检查 n 是否也是完美的正方形!第一次游泳还不错!谢谢大家......
    【解决方案4】:
    find[from_, to_] := Module[{a, b, c, d, e},
      a = Range[from, to];
      b = a^2;
      c = IntegerDigits[b];
      (*Add 1's to the digits of the square,
      except where the square contains a 9*)
      d = MapThread[
        If[MemberQ[#2, 9], Null,
          #1 + FromDigits[ConstantArray[1, Length[#2]]]] &,
        {b, c}];
      (*Find the positions where the square roots are integers*)
      e = Position[Sqrt[d], _?IntegerQ, {1}];
      Extract[a, e]]
    
    find[1, 1000000]
    

    {5、45、115、2205、245795、455645}

    例如

    Sqrt[45^2 + 1111]
    

    56

    Sqrt[455645^2 + 111111111111]
    

    564556

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 2016-09-26
      • 2021-12-19
      • 2020-01-24
      • 2016-06-21
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多