编程 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}]
我的一位同事在他的 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}]