萌新求带!请编程( mathematica)把一个8位数分解
mathematica吧
全部回复
仅看楼主
level 3
不想留足 楼主
萌新求带!请编程( mathematica)把一个8位数分解成素数的乘积,要求自己编写分解程序,不能直接用软件的命令如FactorInteger等来分解 ,注意这里可以用表表示整数的分解,例如100={{2,2},{5,2}}
2020年10月11日 06点10分 1
level 3
不想留足 楼主
好难啊!
2020年10月11日 06点10分 2
level 3
不想留足 楼主
n = 70257333;
s = 0;
If[Mod[n, 2] == 0, b = {2}, b {}];
For[i = 2, i < n, i++,
If[Mod[n, i] == 0 ,
For[j = 2, j < i, j++,
If[Mod[i, j] == 0 , s++] ];
If[s == 0, AppendTo[b, i]]];
s = 0];
d = Length[b];
m = 0;
For[t = 1, t <= d, t++,
For[k = 1, k < 5, k++,
If[Mod[n, b[[t]]^k] == 0, m++]];
b[[t]] = {b[[t]], m};
m = 0];
晕了,不会了
2020年10月11日 08点10分 3
吧务
level 10
如果允许使用Prime系列函数,可以这么写:
f[{i_, n_}] := If[IntegerQ@
#, {2, #
}, {NextPrime@i, n}]&[n/i]
70257333
Most@NestWhileList[
f,
{2, %},
Last@# =!= 1&,
1
]
First/@DeleteDuplicatesBy[Last]@Reverse@%
Times@@%
当然这个有点作弊的感觉。。。不过思路你可以参考。
2020年10月11日 11点10分 4
如果不用NextPrime,可以把NextPrime@i改为i+1。
2020年10月11日 11点10分
谢谢吧主[玫瑰]
2020年10月11日 16点10分
吧务
level 12
primes = Module[{prime, primeQlist, num = 0, tmp, n = 10^4},
prime = ConstantArray[0, n];
primeQlist = ConstantArray[1, n];
Do[
If[primeQlist[[i]] == 1, prime[[++num]] = i];
Do[
If[(tmp = i*prime[[j]]) > n, Break[]];
primeQlist[[tmp]] = 0;
If[Mod[i, prime[[j]]] == 0, Break[]]
, {j, 1, num}],
{i, 2, n}];
prime[[1 ;; num]]
];
factorInteger[n_] := Module[{x, result, i, plist},
x = n;
plist = Pick[primes, Mod[n, primes], 0];
result = Table[
i = 0;
While[Mod[x, p] == 0,
x = x/p;
++i;
];
{p, i}
, {p, plist}];
If[x > 1, AppendTo[result, {x, 1}]];
result
];
testList = RandomInteger[{10^7, 10^8 - 1}, 10^4];
ans1 = FactorInteger /@ testList; // AbsoluteTiming
ans2 = factorInteger /@ testList; // AbsoluteTiming
ans1 == ans2
比内置的慢10倍左右,再想提速大概就得上Compile了。
顺便再提供两个mma一些的写法,思路和速度都差不多
primes = Prime@Range@PrimePi[10^4];
factorInteger[n_] := Module[{result, plist},
plist = Pick[primes, Mod[n, primes], 0];
result =
FoldList[
Function[e, {
#1[[1]]/#
2^e, {#2, e}}][
IntegerExponent[#1[[1]], #2]] &, {n, {0, 0}}, plist];
If[result[[-1, 1]] > 1,
Append[result[[2 ;;, 2]], {result[[-1, 1]], 1}], result[[2 ;;, 2]]]
]
primes = Prime@Range@PrimePi[10^4];
factorInteger[n_] := Module[{result, plist, exponents, x},
plist = Pick[primes, Mod[n, primes], 0];
exponents = IntegerExponent[n, plist];
x = n/Times @@ (plist^exponents);
If[x > 1,
Append[{plist, exponents}\[Transpose], {x, 1}], {plist,
exponents}\[Transpose]]
]
2020年10月11日 16点10分 6
谢谢[玫瑰]
2020年10月11日 23点10分
1