编程 Mathematica 以找到特定的完美平方数集

programming mathematica to find a specific perfect square number set

我的一位同事在他的 C 编程中提出了以下问题 class 我觉得这很有趣。它可以用任何编程语言轻松完成,我立即想到了 wolfram。 问题是这样的:

The number 25 is a unique perfect square, If we increase each digit by one, it becomes 36 which is also a a perfect square! write a program to find another set of numbers with the same qualities.

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

感谢大家。

与其把你扔到海里,不如让我们先帮你在游泳池的浅水区划来划去。

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 中做任何事情总是至少有十几种不同的方法,一些文化围绕着使程序尽可能短,并且可能是神秘的。您可以稍后开始选择它。开始使用新语言时,简单性似乎更好。

希望你玩得开心。

更实用的解决方案。

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?

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

您可以轻松地将其扩展到任何基数,您只需要知道给定基数中的数字有多长。我的意思如下。假设以 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 = 21010000 3)。现在以 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,表示x在基数b.[=14中的总位数=]

使用简单的查找表,您可以在 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}]