Ich versuche, das folgende Problem mit Mathematica zu lösen:kleinste ganze Zahl nicht erhältlich aus {2,3,4,5,6,7,8} (Mathematica)
Was ist die kleinste positive ganze Zahl nicht erhältlich aus der Menge {2,3,4,5,6,7,8}
über arithmetische Operationen {+,-,*,/}
, Potenzierung und Klammern. Jede Nummer im Set muss genau einmal verwendet werden. Unäre Operationen sind NICHT erlaubt (1 kann nicht in -1 konvertiert werden, ohne beispielsweise eine 0 zu verwenden).
Zum Beispiel ist die Nummer 1073741824000000000000000
über (((3+2)*(5+4))/6)^(8+7)
erreichbar.
Ich bin ein Anfänger mit Mathematica. Ich habe Code geschrieben, der meiner Meinung nach die Probleme für das Set {2,3,4,5,6,7}
löst (ich erhielt 2249 als meine Antwort), aber mein Code ist nicht effizient genug, um mit dem Set {2,3,4,5,6,7,8}
zu arbeiten. (Mein Code dauert bereits 71 Sekunden auf dem Set {2,3,4,5,6,7}
)
Ich würde sehr gerne alle Tipps oder Lösungen zur Lösung dieses härteren Problems mit Mathematica, oder allgemeine Einblicke, wie ich meinen vorhandenen Code beschleunigen könnte.
Mein vorhandener Code verwendet eine Brute-Force, rekursive Ansatz:
(* this definiert Kombinationen für einen Satz von 1 Nummer als die Menge, dass 1 Nummer *)
combinations[list_ /; Length[list] == 1] := list
(* diese Tests ob es in Ordnung, zwei Zahlen einschließlich (etwas) willkürliche Einschränkungen potenzieren Überlauf * zu verhindern)
oktoexponent[number1_, number2_] :=
If[number1 == 0, number2 >= 0,
If[number1 < 0,
(-number1)^number2 < 10000 \[And] IntegerQ[number2],
number1^number2 < 10000 \[And] IntegerQ[number2]]]
(* diese Liste nimmt und entfernt Fraktionen mit Nennern g rößere als 100000 *)
cleanup[list_] := Select[list, Denominator[#] < 100000 &]
(* definieren diese Kombinationen für einen Satz von 2 Zahlen - und gibt eine Menge aller möglichen Zahlen über Anwendungen von + erhalten - */gefiltert nach oktoexponent und Bereinigungsregeln *)
combinations[list_ /; Length[list] == 2 && Depth[list] == 2] :=
cleanup[DeleteCases[#, Null] &@[email protected]
{list[[1]] + list[[2]],
list[[1]] - list[[2]],
list[[2]] - list[[1]],
list[[1]]*list[[2]],
If[oktoexponent[list[[1]], list[[2]]], list[[1]]^list[[2]],],
If[oktoexponent[list[[2]], list[[1]]], list[[2]]^list[[1]],],
If[list[[2]] != 0, list[[1]]/list[[2]],],
If[list[[1]] != 0, list[[2]]/list[[1]],]}]
(* diese Kombinationen erstreckt sich mit Sätzen von Sätzen zu arbeiten *)
combinations[
list_ /; Length[list] == 2 && Depth[list] == 3] :=
Module[{m, n, list1, list2},
list1 = list[[1]];
list2 = list[[2]];
m = Length[list1]; n = Length[list2];
cleanup[
[email protected]
[email protected][
combinations[{list1[[i]], list2[[j]]}], {i, m}, {j, n}]]]
(* für einen bestimmten Satz, partition die Menge aller Partitionen in zwei nicht-leere Teilmengen zurück *)
partition[list_] := Module[{subsets},
subsets = Select[Subsets[list], # != {} && # != list &];
[email protected]
Table[[email protected]{subsets[[i]], Complement[list, subsets[[i]]]}, {i,
Length[subsets]}]]
(* diese schließlich Kombinationen erstreckt sich mit Sätzen von jeder Größe * arbeiten)
combinations[list_ /; Length[list] > 2] :=
Module[{partitions, k},
partitions = partition[list];
k = Length[partitions];
cleanup[[email protected]
[email protected]
[email protected](combinations /@
Table[{combinations[partitions[[i]][[1]]],
combinations[partitions[[i]][[2]]]}, {i, k}])]]
Timing[desiredset = combinations[{2, 3, 4, 5, 6, 7}];]
{71.5454, Null}
Complement[
Range[1, 3000], #] &@(Cases[#, x_Integer /; x > 0 && x <= 3000] &@
desiredset)
{2249, 2258, 2327, 2509, 2517, 2654, 2789, 2817, 2841, 2857, 2990, 2998}
Nun, wenn Sie uns Ihren Code zeigen eher als eine grobe Skizze die es einige von uns würden, Ausschneiden und Einfügen und hantieren. –
Irgendwie klingt wie eine Schulaufgabe .. –
ich jetzt meinen Code schreiben werde - Post zunächst nicht, nur weil ich weiß, dass ich ein Anfänger bin, und gehen davon aus, dass eine optimale Code wäre völlig neu geschrieben werden müssen. Jari, ich weiß nicht recht, was ich sagen soll - es ist nicht - ich versuche Mathematica zu lernen und habe die Probleme im Projekt Euler als eine Möglichkeit durchgemacht. Das war ein Problem, das ich mir persönlich in diesem Sinne gestellt habe. – Royce