Estoy tratando de encontrar un algoritmo / función de un programa de ordenador que estoy trabajando. El siguiente aspecto:
$$F(f_1,f_2) = \Delta $$
where $\Delta$ is to be the smallest possible difference among a constrained set of integer multiples of $f_1$ and integer multiples of $f_2$. To put it another way,
$$\Delta = \left\lvert n_1f_1 - n_2f_2\right\rvert\,\,s.t.\,\,\forall a_1,a_2 \in \{z_1,z_1+1,...,z_2\}, \left\lvert n_1f_1-n_2f_2 \right\rvert \le \left\lvert a_1f_1-a_2f_2 \right\rvert \; where\; z_1,z_2 \in \mathbb Z_{\gt 0}$$
Since I only need this for a very specific application, if it helps, we can also assume a few things about $f_1,\,f_2,\,z_1,$ and $z_2$:
$f_1$ and $f_2$ are musical notes from a 12 note, equally tempered scale. This means that $f_1 = (\sqrt[12]{2})^{c_1}f_0$ and $f_2 = (\sqrt[12]{2})^{c_2}f_0$ for some integers $c_1$, $c_2$ and some fundamental frequency $f_0$. Typically $f_0$ is $440hz$. This cannot be assumed here, but we can assume that $f_0$ is some known constant.
We can also assume that $z_1=1$ and $z_2=6$
Obviamente, este problema podría ser resuelto muy fácilmente con una fuerza bruta programa de ordenador, como se ilustra en el pseudo código de abajo:
function(f1,f2){
var delta = f1 - f2
var temp = 0
for(i=1;i<7;i++) {
for(k=1;k<7;k++){
temp = abs(i*f1 - k*f2)
if(temp < delta){
delta = temp
}
}
}
return delta
}
Pero, tiene que haber una solución más elegante, ¿verdad? Alguien me puede ayudar aquí?