I->-I, my solution. See examples at the end. Improvements/ suggestions/
- To: mathgroup at smc.vnet.net
- Subject: [mg106423] I->-I, my solution. See examples at the end. Improvements/ suggestions/
- From: Richard Fateman <fateman at cs.berkeley.edu>
- Date: Tue, 12 Jan 2010 04:48:29 -0500 (EST)
(*Here are some Mathematica programs. (c) 2010 Richard Fateman *)
(
Clear[BetterRules,BRr,BRi,BRc,BRreal,BRnopat,BRpat];
BetterRules[x_List]:=Flatten[ BetterRules /@ x]; (*For a List of Rules,
process each. *)
FreeOfPat= FreeQ[#,_Pattern]&;
ContainsPat = Count[#,_Pattern,Infinity]>0&;
NotOneQ = #!=1& (* not equal to integer 1 *)
BetterRules[lhs_Rational->rhs_]:= BRr[lhs,rhs];
BetterRules[lhs_Integer ->rhs_]:= BRi[lhs,rhs];
BetterRules[lhs_Complex ->rhs_]:= BRc[lhs,rhs];
BetterRules[lhs_Real ->rhs_]:= BRreal[lhs,rhs]; (* no ideas here *)
BetterRules[lhs_?FreeOfPat->rhs_]:= BRnopat[lhs,rhs];
BetterRules[lhs_?ContainsPat -> rhs_]:=BRpat[lhs,rhs];
(* handle delicately or not at all*)
(* Fill in some of the details *)
(* 1/3 -> rhs should change n/3 to n*rhs. Even 5/3 -> 5*rhs*)
BRr[Rational[1,m_],rhs_] := (Rational[k_,m]->k*rhs);
BRr[Rational[n_?NotOneQ,m_],rhs_]:= (n/m->rhs); (*no change if n!=1*)
BRpat[lhs_,rhs_]:= (lhs->rhs); (*no change*)
(* 3*I -> zz could change to a+3*I-> a+zz. [Or, maybe a+I -> a +zz/3
as here] *)
BRc[Complex[0,m_],rhs_] := (Complex[k_,j_]->k+j/m*rhs);
(* What to do with Real? Just the same old thing?*)
BRreal[m_,rhs_] := (m->rhs);
(* for integer 2->x also do 1/2->1/x ; for 2->0 do 1/2->Infinity..*)
BRi[m_,rhs_] := {m->rhs,BRr[1/m,Quiet[1/rhs,Power::infy]]};
(* x^3 -> s also forces x^(-3)-> 1/s *)
BRnopat1[Power[x_,n_],rhs_]:={ x^n->rhs,
x^(-n)->Quiet[1/rhs,Power::infy]} ;
Findvars[expr_] :=
(* make a list of the symbols in an expression? Is there an easier way?? *)
Block[{varlist = {}},
Map[If[AtomQ[#] && Not[NumericQ[#]], AppendTo[varlist, #];] &,
expr, -1];
DeleteDuplicates[varlist]];
(* There is a decision point based on
whether something with no pattern variables involves exactly one
symbolic variable,
in which case we solve for it and choose first solution. *)
BRnopat[lhs_,rhs_]:=
Block [{v=Findvars[lhs]},
Switch[Length[v],
0, (* Constant Expression. what to do?*) lhs->rhs,
1, If [Head[lhs]===Power, BRnopat1[lhs,rhs], (* simple case *)
Block[{RHSx,newrule},
newrule=((Solve[lhs==RHSx,v[[1]]][[1]])/. RHSx->rhs);
Message[BetterRules::solve, lhs->rhs, newrule];
newrule]],
_, (* more than one unknown, can't invert in some obvious way *)
lhs->rhs
]];
BetterRules::solve = "Converting rule `1` into rule `2`"
(* I suppose all the conversions could be incorporated into Messages *)
)
(* end of programs *)
3+0.1 I /. I->0
3+0.1 I /. BetterRules[I->0]
3+12 I /. 3 I -> zz
3+12 I /. BetterRules[3 I -> zz]
3+4 I /. I -> -I
3+4 I /. BetterRules[I -> -I]
x^2+1/x^2 /. x^2-> s
x^2+1/x^2 /. BetterRules[x^2-> s]
5/3 /. 1/3 -> Third
5/3 /. BetterRules[1/3 -> Third]
Exp[x]+Exp[-x] /. Exp[x]->s
Exp[x]+Exp[-x] /. BetterRules[Exp[x]->s]
1+Cos[x]^2 /. Sin[x]->s
1+Cos[x]^2 /. BetterRules[Sin[x]->s]
e^2 + f^2 /. {1/e^2 -> q, f^2 -> r}
e^2 + f^2 /. BetterRules[{1/e^2 -> q, f^2 -> r}]