Rationalizing denominators

Rationalizing expressions

In[]:=
rationalizeSqrtDenominator//ClearAll;​​rationalizeSqrtDenominator[x_]:=​​Module[{num,den,factors,conjugates},​​factors=Join[<|False{{1,1}},True{{1,1}}|>,​​GroupBy[FactorList[x],Last@#≥0&]​​];​​conjugates=Replace[factors[False],(*yessqrts*)​​{(*{r:Power[_,Rational[1,2]],n_Integer}{r,n},*)​​{y_+r:Power[_,Rational[1,2]],n_Integer}{y-r,n},​​_Nothing},​​1];​​conjugates=Times@@Power@@@conjugates;​​num=(Times@@Power@@@factors[True])/conjugates;​​den=conjugates*Times@@Power@@@factors[False];​​Together@Expand[num]*Simplify[den]​​];

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},​​factors=Join[<|False{{1,1}},True{{1,1}}|>,​​GroupBy[FactorList[x],Last@#≥0&]​​];​​conjugates=Replace[factors[False],(*yessqrts*)​​{(*{r:Power[_,Rational[1,2]],n_Integer}{r,n},*)​​{y_+r:Power[_,Rational[1,2]],n_Integer}{y-r,n},​​_Nothing},​​1];​​conjugates=Times@@Power@@@conjugates;​​num=(Times@@Power@@@factors[True])/conjugates;​​den=conjugates*Times@@Power@@@factors[False];​​If[den<0,​​den=-den;num=-num];​​numbox=MakeBoxes[#,StandardForm]&[numFN[num]];​​If[den==1,​​numbox,​​denbox=MakeBoxes[#,StandardForm]&[denFN[1/den]];​​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

Bill's Examples

(rationalizeSqrtDenominatorBoxes[#,Expand]//RawBoxes)&/@{Sin[​​5π/12],Sin[π/12],1/(2Sqrt[2]),1/Sqrt[8],6/Sqrt[9],​​SinDegrees[36]}
Out[]=

2
+
6
4
,
-
2
+
6
4
,
2
4
,
2
4
,2,
2(5-
5
)
4

It's not clear what you want for sin(36º). There's no denominator in the form:
SinDegrees[36]
Out[]=
5
8
-
5
8