Herausforderung
Bei einer links- oder rechtsstochastischen Matrix, bei der sich die Grenze, wenn sich x der Unendlichkeit der Matrix nähert, der Potenz von x einer Matrix mit allen endlichen Werten nähert, die Matrix zurückgeben, zu der die Matrix konvergiert. Grundsätzlich möchten Sie die Matrix so lange mit sich selbst multiplizieren, bis sich das Ergebnis nicht mehr ändert.
Testfälle
[[7/10, 4/10], [3/10, 6/10]] -> [[4/7, 4/7], [3/7, 3/7]]
[[2/5, 4/5], [3/5, 1/5]] -> [[4/7, 4/7], [3/7, 3/7]]
[[1/2, 1/2], [1/2, 1/2]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/3, 2/3], [2/3, 1/3]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/10, 2/10, 3/10], [4/10, 5/10, 6/10], [5/10, 3/10, 1/10]] -> [[27/130, 27/130, 27/130], [66/130, 66/130, 66/130], [37/130, 37/130, 37/130]]
[[1/7, 2/7, 4/7], [2/7, 4/7, 1/7], [4/7, 1/7, 2/7]] -> [[1/3, 1/3, 1/3], [1/3, 1/3, 1/3], [1/3, 1/3, 1/3]]
Regeln
- Standardschlupflöcher gelten
- Sie können wählen, ob Sie eine rechts- oder eine linksstochastische Matrix wünschen
- Sie können jeden vernünftigen Zahlentyp verwenden, z. B. Gleitkommazahlen, Rationals, Dezimalstellen mit unendlicher Genauigkeit usw.
- Dies ist Code-Golf , daher wird die kürzeste Übermittlung in Bytes für jede Sprache zum Gewinner ihrer Sprache erklärt. Es wird keine Antwort akzeptiert
Antworten:
R ,
4443 BytesProbieren Sie es online aus!
Multipliziert einfach weiter, bis eine feste Matrix gefunden wird. Anscheinend
X!=(X=X%*%m)
führt der Vergleich dann eine Neuzuweisung durchX
, das ist also ordentlich.Vielen Dank an @Vlo für das Rasieren eines Bytes. obwohl durchgestrichen 44 ist immer noch regulär 44.
quelle
function(m){ while(any(m!=(m=m%*%m)))0 m}
nicht funktioniert. Numerische Ungenauigkeiten, die verhindern, dass die Beendigungsbedingung ausgelöst wird?Oktave ,
454235 BytesProbieren Sie es online aus!
3 Bytes dank Giuseppe und 7 weitere dank Luis Mendo!
Dies verwendet, dass der dem Eigenwert 1 entsprechende Eigenvektor (auch der maximale Eigenwert) der Spaltenvektor ist, der für jeden Wert der Grenzmatrix wiederholt wird. Wir müssen den Vektor normalisieren, um die Summe 1 zu haben, damit er stochastisch ist. Dann wiederholen wir ihn einfach, um die Matrix auszufüllen. Ich bin nicht besonders gut mit dem Golfen von Octave vertraut, aber ich konnte keinen funktionalen Weg finden, um wiederholte Multiplikationen durchzuführen, und ein vollständiges Programm scheint immer länger zu sein.
Wir können verwenden,
any(A)
da wir aufgrund der Einschränkungen wissen, dass die Matrix eine irreduzible Markov-Kette beschreiben muss und daher jeder Zustand von den anderen Zuständen aus erreichbar sein muss. Daher muss mindestens ein Wert in jeder Spalte ungleich Null sein.quelle
eigs
immer der entsprechende Eigenvektor zurückgegeben1
? Meine Erinnerung an Markov-Ketten ist etwas verschwommen.eigs
kehrt ausgehend vom größten Eigenwert zurück. Danke auch für den Golf!Wolfram Language (Mathematica) , 14 Bytes
Ausgabe schwebt:
Probieren Sie es online aus!
Wolfram Language (Mathematica) , 30 Bytes
Ausgabefraktionen:
Probieren Sie es online aus!
quelle
Gelee , 6 Bytes
Dies ist ein vollständiges Programm.
Probieren Sie es online aus!
quelle
APL (Dyalog) ,
186 Bytes12 Bytes dank @ H.PWiz gespeichert
Probieren Sie es online aus!
quelle
+.×⍨⍣≡
für 6 Bytes. Das heißt, quadratisch, bis sich nichts mehr ändertk / q, 10 Bytes
k / q, weil das Programm in beiden Sprachen identisch ist. Der Code ist wirklich nur idiomatisch k / q.
Erläuterung
{..}
ist aus Lambda-Syntax, mitx
als impliziter Parameter$[x]
hat $ als Multiplikationsoperator für die binäre Matrix. Wenn nur ein Parameter angegeben wird, wird ein unärer Operator erstellt, der Multiplikationen mit der Markov-Matrix hinterlässt/[x]
wendet die linke Multiplikation bis zur Konvergenz an, beginnend mit x selbst.quelle
C (gcc) ,
207192190181176 Bytes + 2 Flagbytes-lm
fünfzehnsiebzehnzwanzig-zwei Bytes dank ceilingcat .return A;
.Probieren Sie es online aus!
quelle
Python 3 ,
7561 BytesProbieren Sie es online aus!
In Testfällen treten Float-Ungenauigkeiten auf, sodass die Werte geringfügig von den genauen Brüchen abweichen können.
PS.
numpy.allclose()
wird verwendet, weilnumpy.array_equal()
es länger ist und zu Ungenauigkeiten neigt.-14 Bytes Danke HyperNeutrino;) Oh ja, ich habe den @ -Operator vergessen; P.
quelle
dot
anstelle vonmatmul
: Dx=n@n
f=
weil es rekursiv genannt wird;)Java 8,
356339 Bytes-17 Bytes dank @ceilingcat .
Auf jeden Fall nicht die richtige Sprache. Verdammte Gleitkommapräzision.
Erläuterung:
Probieren Sie es online aus.
quelle
float
/double
nicht die richtige Gleitkommapräzision haben,java.math.BigDecimal
sollte stattdessen verwendet werden. Und statt einfach+-*/
, BigDecimals verwenden.add(...)
,.subtract(...)
,.multiply(...)
,.divide(...)
. Also etwas so einfach wie es7/10
wirdnew BigDecimal(7).divide(new BigDecimal(10))
. Außerdem sind die,scale,RoundingMode
in thedivide
für Werte mit 'unendlichen' Dezimalwerten (wie1/3
Sein0.333...
) erforderlich . Die Hauptmethode kann natürlich Golf gespielt werden, aber ich habe mich nicht darum gekümmert, als ich gesucht und ersetzt habe, um die Floats in BigDecimals umzuwandeln.