Hey então I'estou a fazer um programa de factoring e I'estou a pensar se alguém me pode dar algumas ideias sobre uma forma eficiente de encontrar o que dois números múltiplos para um número especificado, e também adicionar a um número especificado.
por exemplo, posso ter
(a)(b) = 6
a + b = 5
Portanto, essencialmente, só preciso de uma forma de encontrar os valores a e b. Neste caso, seriam 2 e 3.
Alguém me pode dar algumas ideias sobre por onde começar? Os números negativos também devem ser considerados para utilização.
Vá lá pessoal, não há necessidade de loop, basta usar matemática simples para resolver este sistema de equações:
a*b = i;
a+b = j;
a = j/b;
a = i-b;
j/b = i-b; assim:
b + j/b + i = 0
b^2 + ib + j = 0
A partir daqui, é uma equação quadrática, e é trivial encontrar b (basta implementar a fórmula da equação quadrática) e a partir daí obter o valor para a.
EDITAR:
Aí está:
function finder($add,$product)
{
$inside_root = $add*$add - 4*$product;
if($inside_root >=0)
{
$b = ($add + sqrt($inside_root))/2;
$a = $add - $b;
echo "$a+$b = $add and $a*$b=$product\n";
}else
{
echo "No real solution\n";
}
}
Acção real ao vivo:
Eis como o faria:
$sum = 5;
$product = 6;
$found = FALSE;
for ($a = 1; $a < $sum; $a++) {
$b = $sum - $a;
if ($a * $b == $product) {
$found = TRUE;
break;
}
}
if ($found) {
echo "The answer is a = $a, b = $b.";
} else {
echo "There is no answer where a and b are both integers.";
}
Basicamente, começar com $a = 1
e $b = $sum - $a
, passar um de cada vez desde que sabemos então que $a + $b == $sum
é sempre verdade, e multiplicar $a
e $b
para ver se são iguais a $produto
. Se o fizerem, isso'é a resposta.
Se esse é o método mais eficiente é muito discutível.
Com a multiplicação, recomendo a utilização do operador do módulo (%) para determinar quais os números que se dividem uniformemente no número alvo, como por exemplo:
$factors = array();
for($i = 0; $i < $target; $i++){
if($target % $i == 0){
$temp = array()
$a = $i;
$b = $target / $i;
$temp["a"] = $a;
$temp["b"] = $b;
$temp["index"] = $i;
array_push($factors, $temp);
}
}
Isto deixá-lo-ia com um conjunto de factores do número alvo.