Coefficient
wird nicht erweitert, es sei denn, es ist absolut notwendig, dies zu tun. Dies vermeidet tatsächlich Speicherexplosionen. Ich glaube, dass es seit Version 3 so war (ich glaube, ich habe ungefähr 1995 daran gearbeitet).
Es kann auch schneller sein, um eine Erweiterung zu vermeiden. Hier ist ein einfaches Beispiel.
%Vor% Aber das nächste scheint in Version 8 zu hängen und dauert mindestens eine halbe Minute in der Entwicklung Mathematica (wo Expand
geändert wurde).
Möglicherweise sollten einige Heuristiken hinzugefügt werden, um nach Univariaten zu suchen, die nicht explodieren. Scheint jedoch nicht wie ein Gegenstand mit hoher Priorität.
Daniel Lichtblau
Hier ist ein Hack, der Ihren Code möglicherweise schnell macht, aber ich garantiere nicht, dass er immer korrekt funktioniert:
%Vor%Wenn wir es verwenden, erhalten wir:
%Vor% Die Idee ist, dass Coefficient
intern Binomial
verwendet, um die Anzahl der Terme zu schätzen, und dann expandiert (Aufrufe Expand
), wenn die Anzahl der Terme kleiner als 1000
ist, die Sie überprüfen können mit Trace[..., TraceInternal->True]
. Und wenn es nicht expandiert, berechnet es viele Summen von großen Koeffizientenlisten, die von Nullen dominiert werden, und dies ist offensichtlich langsamer als das Expandieren für eine Reihe von Ausdrücken. Ich täusche Binomial
, um eine kleine Zahl ( 10
) zurückzugeben, aber ich habe auch versucht, es so zu machen, dass es nur die Binomial
betrifft, die intern von Coefficient
aufgerufen wird:
Ich kann jedoch nicht garantieren, dass es keine Beispiele gibt, bei denen Binomial
irgendwo anders im Code falsch berechnet wird.
BEARBEITEN
Natürlich ist eine sicherere Alternative, die immer existiert, Coefficient
mit dem Villegas - Gayley Trick, erweitern einen Ausdruck darin und rufen es erneut:
BEARBEITEN 2
Mein erster Vorschlag hatte den Vorteil, dass wir ein Makro definierten, das die Eigenschaften von Funktionen lokal änderte, aber den Nachteil, dass es unsicher war. Mein zweiter Vorschlag ist sicherer, aber ändert Coefficient
global, so dass immer erweitert wird, bis wir diese Definition entfernen. Wir können das Beste aus beiden Welten mit Hilfe von % co_de haben % , die eine lokale Kopie einer bestimmten Funktion erstellt. Hier ist der Code:
Die Verwendung ähnelt dem ersten Fall:
%Vor% Die Hauptfunktion Internal'InheritedBlock
bleibt jedoch davon unberührt:
Tags und Links wolfram-mathematica performance expand