Rationalizing denominators

Rationalizing expressions

In[]:=
rationalizeSqrtDenominator//ClearAll;​​rationalizeSqrtDenominator[x_]:=​​Module[{num,den,factors,conjugates},​​{num,den}=NumeratorDenominator[x];​​factors=​​GroupBy[FactorList[den],​​FreeQ[First@#,Power[_,Rational[1,2]]]&&IntegerQ[Last@#]&];​​num/=Times@@Power@@@factors[True];(*nosqrts*)​​conjugates=Replace[factors[False],(*yessqrts*)​​{{r:Power[_,Rational[1,2]],n_}:>{r,n},​​{y_+r:Power[_,Rational[1,2]],n_}:>{y-r,n}},​​1];​​conjugates=Times@@Power@@@conjugates;​​num*=conjugates;​​Together@Expand[num]/​​Simplify[conjugates*Times@@Power@@@factors[False]]​​];

Examples

rationalizeSqrtDenominator[1/Identity[Pi^2Sqrt[8](3-Sqrt[27])]]
Out[]=
-
2
+
6
24
2
π
rationalizeSqrtDenominator[Sin[Pi/12]]
Out[]=
1
4
(-
2
+
6
)
rationalizeSqrtDenominator[1/Sqrt[8]](*fails*)
Out[]=
1
2
2

Rationalized output

In[]:=
rationalizeSqrtDenominatorBoxes//ClearAll;​​rationalizeSqrtDenominatorBoxes[x_]:=​​rationalizeSqrtDenominatorBoxes[x,{Simplify,Simplify}];​​rationalizeSqrtDenominatorBoxes[x_,{numFN_,denFN_}]:=​​Module[{num,den,factors,conjugates,numbox,denbox},​​{num,den}=NumeratorDenominator[x];​​factors=​​GroupBy[FactorList[den],​​FreeQ[First@#,Power[_,Rational[1,2]]]&&IntegerQ[Last@#]&];​​(*num/=Times@@Power@@@factors[True];(*nosqrts*)*)​​conjugates=Replace[factors[False],(*yessqrts*)​​{{r:Power[_,Rational[1,2]],n_}:>{r,n},​​{y_+r:Power[_,Rational[1,2]],n_}:>{y-r,n}},​​1];​​conjugates=Times@@Power@@@conjugates;​​num*=conjugates;​​numbox=MakeBoxes[#,StandardForm]&[numFN[num]];​​denbox=​​MakeBoxes[#,StandardForm]&[​​denFN[(Times@@Power@@@factors[True])*conjugates*​​Times@@Power@@@factors[False]]];​​FractionBox[numbox,denbox]​​];​​rationalizeSqrtDenominatorBoxes[x_,simpFN_]:=​​rationalizeSqrtDenominatorBoxes[x,{simpFN,simpFN}];

Examples

rationalizeSqrtDenominatorBoxes[​​1/Identity[Pi^2Sqrt[8](3-Sqrt[27])]]//RawBoxes
Out[]=
-
2
(1+
3
)
24
2
π
rationalizeSqrtDenominatorBoxes[Sin[Pi/12]]//RawBoxes
Out[]=
2
(-1+
3
)
4
rationalizeSqrtDenominatorBoxes[Sin[Pi/12],Expand]//RawBoxes
Out[]=
-
2
+
6
4
rationalizeSqrtDenominatorBoxes[1/Sqrt[8]]//RawBoxes(*succeeds*)
Out[]=
2
4
%^2(*resultisnotnumeric*)
Out[]=
2
2
4
2
4
^2(*copy-pasteoutputtogetnumericinput*)
Out[]=
1
8