编程mathematica以查找特定的完美平方数集

时间:2018-12-02 11:41:45

标签: wolfram-mathematica

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

  

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

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

感谢所有人。

4 个答案:

答案 0 :(得分:2)

功能更强大的解决方案。

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?

答案 1 :(得分:2)

您可以轻松地将其扩展到任何基数,而您只需要知道数字在给定基数中的长度即可。我的意思是以下内容。假设以10为底,数字为25。要检查前提,我们需要加11。但是11仅仅是:

object = [
    {
      table: [
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: '',
          assess: '',
          hold: ''
        },
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: '',
          assess: '',
          hold: ''
        },
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: '',
          assess: '',
          hold: ''
        },
      ],
      showindex: 1
    },

    {
      table: [
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: 'stuff',
          assess: 'stuff',
          hold: 'stuff'
        },
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: '',
          assess: '',
          hold: ''
        },
        {
          category: 'Dev thing',
          capability: 'Data Access',
          adopt: 'Spring Data',
          trial: '',
          assess: '',
          hold: ''
        },
      ],
      showindex: 1
    }
  ];

现在想象数字 72×72 = 5184 ,但以3为底的数字( 5184 10 = 21010000 3 )。现在以3为基础进行计算,您将得到

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

其中 102121111 3 = 8464 10 = 92 10 ×92 10

您注意到,您要做的就是将数字(b n -1)/(b-1)添加到数字中,然后检查是否为一个正方形。这里的 n 表示以 b 为底的数字 x 的总位数。

通过一个简单的查找表,您可以在Mathematica中执行以下操作:

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

然后以2为底的完整列表会以10为底:

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 :(得分:1)

让您不必先将自己扔入大海,而是先在游泳池的浅水区划一圈。

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中,至少总是有十二种不同的方式来做任何事情,并且某些文化围绕着使程序尽可能短,并且可能尽可能地含糊不清。您可以稍后再开始整理。开始使用新语言时,简单性似乎更好。

我希望你玩得开心。

答案 3 :(得分:1)

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