Display Log with desired notation in output
One can use $PrePrint
and ReplaceAll
to effect this:
$PrePrint = # /. {
Log[n_]/Log[2] :> Defer @ Log2[n],
Log[n_]/Log[10] :> Defer @ Log10[n],
Log[n_]/Log[b_] :> Defer @ Log[b, n]
} &;
Or MakeBoxes
:
MakeBoxes[Log[n_]/Log[2], fmt_] := ToBoxes[Defer @ Log2[n], fmt]
MakeBoxes[Log[n_]/Log[10], fmt_] := ToBoxes[Defer @ Log10[n], fmt]
MakeBoxes[Log[n_]/Log[b_], fmt_] := ToBoxes[Defer @ Log[b, n], fmt]
It is also possible to use Format
but in this case it requires unprotecting Times
:
Unprotect[Times];
Format[Log[n_]/Log[2]] := Defer @ Log2[n]
Format[Log[n_]/Log[10]] := Defer @ Log10[n]
Format[Log[n_]/Log[b_]] := Defer @ Log[b, n]
Protect[Times];
These assignments are made to a special class of rules: FormatValues
. Because these are only used in formatting this should not slow down internal operations using Times
, unlike overloading UpValues
or DownValues
.
Each method relies on Defer
to prevent an infinite recursion yet allow evaluation of output when it is given as input.
Result:
Using a trick similar to what Chip showed in this answer:
SetSystemOptions["SimplificationOptions" -> "AutosimplifyTwoArgumentLog" -> False];
logRule = Log[x_]/Log[b_] :> Switch[b, 2, Log2[x], 10, Log10[x], _, Log[b, x]];
{Log[17]/Log[2], Log[13]/Log[10], Log[99]/Log[11]} /. logRule
{Log2[17], Log10[13], Log[11, 99]}
Sjoerd's example in a comment to the Wizard's answer requires some finesse:
Expand[(Log[17] + Log[4])/Log[10]] /. logRule
Log10[4] + Log10[17]