Bill Page wrote: > > On 2014-09-13 10:40 AM, "Waldek Hebisch" <[email protected]> wrote: > > > > I think that this is wrong way. Namely you take unsound > > default (that is make 'D(conjugate(x), x)' equal to 0) > > To my knowledge Wirtinger calculus, which defines D(conjugate(x),x) = > 0, is an accepted albeit infrequently taught part of complex analysis > so your comment made me feel a bit irritated. Perhaps the fact that > you seem to consider it unsound reflects a lack of knowledge or some > unstated prejudice? The fundamental notion is that x and conjugate(x) > are independent of each other. Do you think that this is wrong?
Let me explain: Wirtinger derivatives are fine. But they form effectively _bivariate_ calculus. More precisely, instead of one complex variable we have two derivatives build from derivatives in two real variables. 'Expression' assumes single derivative per variable. Wirtinger derivatives have nice feature that on holomorphic functions the second derivative is zero and can be ignored, so on holomorphic functions one can work as in univariate setting. But once you have 'abs' and 'conjugate' in 'Expression' assumption that all functions are holomorphic is unsound. So using only one Wirtinger derivative in 'Expression' is unsound. To make it sound you need to handle _both_ derivatives. But then you get something quite different than 'Expression'. In Axiom spirit one could define new domain which uses Wirtinger derivatives (say special variant of 'Complex'). Or we could follow M-s and use assumption system and runtime test to decide if we can use single Wirtinger derivative. But in current 'Expression' single derivative per variable is an axiom. > > > and then try to 'opt out' in places where is causes > > troubles. > > I do not want to opt out anywhere. The problem in EFSTRUC seems to be > that it assumes that f(x) cannot be independent of x Which is _fundamental_ assumption in 'Expression'. > which of course > is not true for conjugate..The preliminary change was only intended to > avoid the bug. > > I took a look at the code in EFSTRUC more carefully. Now in an > updated version of > > http://axiom-wiki.newsynthesis.org/SandBoxElementaryFunctionStructurePackage > > I have the following code: > > -- total Wirtinger derivative allows expressions containing > conjugate to be normalized > -- Wirtinger derivatives: wdiff(f,x) and wdiff(f,conjugate(x)) > wdiff(ex:F,z:K):F == > > eval(differentiate(eval(ex,[z],[coerce('%conjugate)]),'%conjugate),[kernel('%conjugate)],[z::F]) > totalDifferentiate(f:F,x:SY):F == > wdiff(f,kernel(x))+wdiff(f,kernels(conjugate(coerce > x)$FunctionalSpecialFunction(R, F))(1) ) > > For holmorphic functions the "total" Wirtinger derivative (sum of both > Wirtinger derivatives) is equal to the usual derivative since > D(f(x),conjugate(x)) is 0. For non-holomorphic functions like > conjugate itself, the result is not zero. > > The example shows that normalize now normalizes expressions containing > conjugate successfully, but of course more testing is needed. Correctness of 'normalize' is a theorem. In particular, 'normalize' is a zero test "modulo constants". You dropped one of main assumption of this theorem. Richardson theorem tells you that once you drop this assumption you no longer can have computable zero test (even "modulo constants"). So your modified 'normalize' is not correct if you demand it to be zero test. It is open question what your 'normalize' is doing, maybe it is good enough to perform interesting calculations. But I am affraid that that it is nontrivial work to check and adapt other parts of Expression machinery. Let me add that it is quite interesting what you managed to do with 'conjugate'. But 'D(conjugate(x)) = 0' brings us unconfortanly close to uncomputable problems. If we could have 'D(conjugate(x)) = 0' and retain power of current algortiths, that would be significant progress. But expression machinery to avoid Richardson theorem must make some restricions. Current theory basically forbids 'conjugate'. To admit conjugate we need some extra restrictions. > > Basicaly D(conjugate(x), x) = 0 or even > > 'conjugate(log(x)) = log(conjugate(x))' are too unsafe to > > apply them by default. Rather they should be done by > > separate functions, which are either explicitely > > requested by user or called when we know that needed > > assumptions are satisfied. > > > > I am not aware of any assumptions that are needed. Consider: (3) -> conjugate(log(complex(-1.0, 0))) (3) - 3.1415926535_897932385 %i Type: Complex(Float) (4) -> log(conjugate(complex(-1.0, 0))) (4) 3.1415926535_897932385 %i Type: Complex(Float) Do you still think that all users always want 'conjugate(log(x)) = log(conjugate(x))'? I would say to perform this transformation we need apropriate assumptions. -- Waldek Hebisch [email protected] -- You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/fricas-devel. For more options, visit https://groups.google.com/d/optout.
