Ce module est destiné à stocker des fonctions utiles en algèbre.

La fonction fraction permet de transformer un nombre écrit sous forme décimale en fraction approchant au mieux le nombre tout en ayant un numérateur et un dénominateur de valeur pas trop élevé.

Par exemple :

Pour 1.5, {{#invoke:Algèbre|fraction|1.5}} donne 3/2.

Pour 0.153153153, {{#invoke:Algèbre|fraction|0.153153153}} donne 17/111.

Pour π, {{#invoke:Algèbre|fraction|3.1415926536}} donne 355/113.

Pour e, {{#invoke:Algèbre|fraction|2.71828182846}} donne 193/71.


local p = {}

function p.fraction(frame)
	local x, i, num, den
	local n = {99, 99, 99, 99, 99, 99, 99, 99, 99, 99}
	i = 1
	x = tonumber(frame.args[1])
	if x > 0.001 then -- Traite le cas ou le nombre n’est pas proche de 0
		n[i],x = math.modf(x)
		while
			x > 0.001 and i < 10
		do
			x = 1/x
			i = i + 1
			n[i],x = math.modf(x)
		end
		if i == 10 then
			i = 2
			for j = 3, 10 do
				if n[j] > n[i] then i = j end
			end
			i = i - 1
		end
		num = 0
		den = 1
		for j = i, 1, -1 do
			num,den = den,n[j]*den + num
		end
	else -- Traite le cas ou le nombre est proche de 0
		if x > 0 then -- Traite le cas ou le nombre proche de 0 mais pas nul
			x = 1/x
			num,x = math.modf(x)
			den = 1
			if x > 0 then -- Augmente la précision
				x = 1/x
				den = math.modf(x)
				num = num*den + 1
			end
		else -- Traite le cas ou le nombre est nul
			den = 0
			num = 1
		end
	end
	
	return den.."/"..num
end

return p