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]]
]