<span class="Apple-style-span" style="font-family: &#39;Times New Roman&#39;; font-size: medium; "><pre><font class="Apple-style-span" face="&#39;Times New Roman&#39;"><span class="Apple-style-span" style="white-space: normal;">&gt;</span></font>Hello,

&gt;On Tue, Sep 21, 2010 at 12:01 AM, Jose Antonio Garcia Peiro
&gt;&lt;<a href="https://www.cebix.net/mailman/listinfo/ginac-list">jgpeiro at gmail.com</a>&gt; wrote:

&gt;&gt;<i> I think that the problem is at internal representation or at internal order. When
</i>&gt;&gt;<i> I debug the code, same expression prints differ.
</i>&gt;&gt;<i> ex test = pow(log(x),2)/x;
</i>&gt;&gt;<i> cout &lt;&lt; test;
</i>&gt;&gt;<i> // sometimes x^(-1)*log(x)^2
</i>&gt;&gt;<i> // other sometimes log(x)^2*x^(-1)
</i>
&gt;Works as designed. This behavior is documented in the manual
&gt;(section 5.7.2, titled as &#39;Expanding  and collecting&#39;): &quot;Again,
&gt;since the canonical form in GiNaC is not easy to guess you
&gt;should be prepared to see different orderings of terms in such
&gt;sums!&quot;. Also it has been explained on this mailing list several
&gt;(quite a number, actually) times, see e.g.

&gt; <a href="http://www.cebix.net/pipermail/ginac-list/2010-April/001598.html">http://www.cebix.net/pipermail/ginac-list/2010-April/001598.html</a>

&gt; <a href="http://www.ginac.de/pipermail/ginac-list/2008-August/001403.html">h</a><a href="http://www.ginac.de/pipermail/ginac-list/2008-August/001403.html">ttp://www.ginac.de/pipermail/ginac-list/2008-August/001403.html</a></pre>
<pre>&gt;&gt;<i> How I can force GiNaC to unique representation?
</i>
&gt;You can&#39;t. And there&#39;s no need to do so. Instead fix the (buggy)
&gt;code which makes assuptions about term ordering.

&gt;&gt;<i> I am try to test expressions with &quot;match&quot;, but it not works
</i>&gt;&gt;<i> always with the same expression.
</i>
&gt;Could you please post the actual expression and the pattern,
&gt;so I can make a (more) specific suggestion?

&gt;Best regards,
&gt;        Alexei</pre><pre><br></pre><pre><span class="Apple-style-span" style="font-family: &#39;Times New Roman&#39;; white-space: normal; "><pre>&gt;You can&#39;t. And there&#39;s no need to do so. Instead fix the (buggy)
&gt;code which makes assuptions about term ordering.
</pre><div><font class="Apple-style-span" face="monospace"><span class="Apple-style-span" style="white-space: pre;"><i>mmm, I write about 50 lines with these assumptions, and i think that is 
not easy to correct....:-(</i></span></font></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><br></i></span></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><span class="Apple-style-span" style="font-family: &#39;Times New Roman&#39;; font-style: normal; white-space: normal; "><pre>
&gt;Could you please post the actual expression and the pattern,
&gt;so I can make a (more) specific suggestion?
</pre><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i>The code try to find the integral of a function. The code include all basic integration rules, for the function log(x)^2*x^(-1) apply these rule.</i></span></div>
<div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><br></i></span></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i>ex f = pow(log(x),2)/x;</i></span><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><i><i>        // case a: f = x^(-1)*log(x)^2, case b: </i></i></i></span><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><i><i><i>log(x)^2*</i></i></i></i></span><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><i><i><i><i>x^(-1)</i></i></i></i></i></span></div>
</span></i></span></div><div><font class="Apple-style-span" face="monospace"><span class="Apple-style-span" style="white-space: pre;"><i>ex w0, w1, w2;</i></span></font></div><div><font class="Apple-style-span" face="monospace"><span class="Apple-style-span" style="white-space: pre;"><i>exmap m;</i></span></font></div>
<div><font class="Apple-style-span" face="monospace"><span class="Apple-style-span" style="white-space: pre;"><i><br></i></span></font></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i>if( f.match( pow(wild(0),wild(1))*wild(2), m ) || f.match( pow(wild(0),wild(1)), m ) ){
        </i></span><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><i>// int( f^c*f&#39;, x) = f^(c+1)/(c+1) or ln(f) if c == -1</i></i></span></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><i>        </i>w2 = 1;
        for( exmap::const_iterator i=m.begin(); i!=m.end(); ++i){
                if        (i-&gt;first.is_equal(wild(0)) )        w0 = i-&gt;second; // f
                else if        (i-&gt;first.is_equal(wild(1)) )        w1 = i-&gt;second; // c
                else if        (i-&gt;first.is_equal(wild(2)) )        w2 = i-&gt;second; // f&#39;
        }                
<span class="Apple-style-span" style="font-style: normal; "><i>        </i></span>if( has(w0,x) &amp;&amp; !has(w1,x) ){ // f depends on x and c is constant
                ex dw0 = w0.diff(x,1);
                if( !dw0.is_equal(0) ){ // prevents division by 0
                        if( !has(w2/dw0,x) ){
                                 if( w1.is_equal(-1) ){ //check if c == -1
                                        return log( w0 ) * (w2/dw0);
                                }else{
                                        return pow( w0, w1+1 )/(w1+1) * (w2/dw0);
                                }
                        }
                }
        }
}
</i></span></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i><br></i></span></div><div><span class="Apple-style-span" style="font-family: monospace; white-space: pre; "><i>In case a: f = x, c = -1, and f&#39; = log(x)^2, the code cannot compute the integral because f&#39;/df = w2/dw0 = (log(x)^2)/(-x^-2) has the term &#39;x&#39; and it cannot move out of integral.</i></span></div>
<div><i><font class="Apple-style-span" face="monospace"><span class="Apple-style-span" style="white-space: pre;">In case b: f = log(x), c = 2, f&#39; = x^(-1), the code can compute integral because f&#39;/df = w2/dw0 = x^(-1)/x^(-1) do not have the term &#39;x&#39; and it can move out of integral.</span></font></i></div>
</span></pre><pre><span class="Apple-style-span" style="font-family: &#39;Times New Roman&#39;; white-space: normal; "><pre>The code fails because I assume that the product w2 dont have powers. </pre></span></pre></span>