I have just checked Frank's observation. It is quite true that Reduce seems to do much better (I ignored some error messages), but it is not always right either.
MCNumber = 10000; Tally[Monitor[Table[
Atemp = RandomReal[] - 0.5; Btemp = RandomReal[] - 0.5;
Ctemp = RandomReal[] - 0.5; Dtemp = RandomReal[] - 0.5;
Etemp = RandomReal[] - 0.5;
Sort[Table[
N[Reduce[
Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0 /. {Aa -> Atemp,
Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp, Ee -> Etemp},
x]][[i, 2]], {i, 1,
Length[N[
Reduce[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee ==
0 /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Temp}, x]]]}]] ==
Sort[Table[
N[Reduce[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0,
x] /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Etemp}][[i, 2]], {i, 1,
Length[N[
Reduce[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0,
x] /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Etemp}]]}]], {k, 1, MCNumber}],
ProgressIndicator[k, {0, MCNumber}]]]
gave
{{True, 9981}, {False, 19}}
Another thing is that Solve is performing about the same as Roots:
MCNumber = 1000; Tally[Monitor[Table[
Atemp = RandomReal[] - 0.5; Btemp = RandomReal[] - 0.5;
Ctemp = RandomReal[] - 0.5; Dtemp = RandomReal[] - 0.5;
Etemp = RandomReal[] - 0.5;
Sort[Table[
x /. N[Solve[
Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0 /. {Aa -> Atemp,
Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp, Ee -> Etemp},
x]][[i]], {i, 1,
Length[N[
Solve[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee ==
0 /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Temp}, x]]]}]
] ==
Sort[Table[
x /. N[Solve[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0,
x] /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Etemp}][[i]], {i, 1,
Length[N[
Solve[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0,
x] /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Etemp}]]}]
], {k, 1, MCNumber}], ProgressIndicator[k, {0, MCNumber}]]]
gives
{{True, 621}, {False, 379}}
So 38% wrong results. Also, even if Reduce is better, it is curious that Solve and Roots have problems in more than one third of the cases without giving any warning.
Cheers,
Marco
PS: In fact I think that the program is very inefficient. I solve the equation once more for the upper limit of the Table command which is not really required. A 4 there does the trick.
MCNumber = 10000; Tally[Monitor[Table[
Atemp = RandomReal[] - 0.5; Btemp = RandomReal[] - 0.5;
Ctemp = RandomReal[] - 0.5; Dtemp = RandomReal[] - 0.5;
Etemp = RandomReal[] - 0.5;
Sort[Table[
N[Reduce[
Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0 /. {Aa -> Atemp,
Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp, Ee -> Etemp},
x]][[i, 2]], {i, 1, 4}]] ==
Sort[Table[
N[Reduce[Aa x^4 + Bb x^3 + Cc x^2 + Dd x + Ee == 0,
x] /. {Aa -> Atemp, Bb -> Btemp, Cc -> Ctemp, Dd -> Dtemp,
Ee -> Etemp}][[i, 2]], {i, 1, 4}]], {k, 1, MCNumber}],
ProgressIndicator[k, {0, MCNumber}]]]