Bug #10086 ยป Remove_Rational#power_from_mathn.patch
lib/mathn.rb  

77  77 
end 
78  78  
79  79 
## 
80 
# When mathn is required Rational is changed to simplify the use of Rational 

81 
# operations. 

82 
# 

83 
# Normal behaviour: 

84 
# 

85 
# Rational.new!(1,3) ** 2 # => Rational(1, 9) 

86 
# (1 / 3) ** 2 # => 0 

87 
# 

88 
# require 'mathn' behaviour: 

89 
# 

90 
# (1 / 3) ** 2 # => 1/9 

91  
92 
class Rational 

93 
remove_method :** 

94  
95 
## 

96 
# Exponentiate by +other+ 

97 
# 

98 
# (1/3) ** 2 # => 1/9 

99  
100 
def ** (other) 

101 
if other.kind_of?(Rational) 

102 
other2 = other 

103 
if self < 0 

104 
return Complex(self, 0.0) ** other 

105 
elsif other == 0 

106 
return Rational(1,1) 

107 
elsif self == 0 

108 
return Rational(0,1) 

109 
elsif self == 1 

110 
return Rational(1,1) 

111 
end 

112  
113 
npd = numerator.prime_division 

114 
dpd = denominator.prime_division 

115 
if other < 0 

116 
other = other 

117 
npd, dpd = dpd, npd 

118 
end 

119  
120 
for elm in npd 

121 
elm[1] = elm[1] * other 

122 
if !elm[1].kind_of?(Integer) and elm[1].denominator != 1 

123 
return Float(self) ** other2 

124 
end 

125 
elm[1] = elm[1].to_i 

126 
end 

127  
128 
for elm in dpd 

129 
elm[1] = elm[1] * other 

130 
if !elm[1].kind_of?(Integer) and elm[1].denominator != 1 

131 
return Float(self) ** other2 

132 
end 

133 
elm[1] = elm[1].to_i 

134 
end 

135  
136 
num = Integer.from_prime_division(npd) 

137 
den = Integer.from_prime_division(dpd) 

138  
139 
Rational(num,den) 

140  
141 
elsif other.kind_of?(Integer) 

142 
if other > 0 

143 
num = numerator ** other 

144 
den = denominator ** other 

145 
elsif other < 0 

146 
num = denominator ** other 

147 
den = numerator ** other 

148 
elsif other == 0 

149 
num = 1 

150 
den = 1 

151 
end 

152 
Rational(num, den) 

153 
elsif other.kind_of?(Float) 

154 
Float(self) ** other 

155 
else 

156 
x , y = other.coerce(self) 

157 
x ** y 

158 
end 

159 
end 

160 
end 

161  
162 
## 

163  80 
# When mathn is required, the Math module changes as follows: 
164  81 
# 
165  82 
# Standard Math module behaviour: 