Как решить z = (((m / k) / j) / x) для x, оптимизируя z к 2ˣ
Скажем, у меня есть эти переменные:
m
количество доступной памяти в битахk
это разделительный факторj
является еще одним делительным фактором, хранящимся в качестве отдельной переменной, а не в сочетании сk
x
это значение, которое мы хотим выяснить.z
это значение, к которому мы хотим быть ближе всего2^x
Тогда у нас есть
let z = (((m / k) / j) / x)
Так, например, скажем, у нас есть это:
m = 2000000
k = 5
j = 10
x = ?
z = ?
Тогда у нас есть
let z = ((2000000 / 5) / 10) / x
Я хотел бы выяснить, что x
дано, что z
должно быть максимально близко к 2 x
насколько это возможно. В настоящее время я делаю это, просто вставляя числа и пытаясь приблизить их к соответствию. Но мне интересно, какой общий способ программно решить эту проблему. Но, например, я мог бы попробовать подключить x = 10
, что равно:
4000 = ((2000000 / 5) / 10) / 10
затем 2¹⁰ = 1024
что прилично близко к 4000, но я не знаю, что будет ближе. Попытка x = 11
дает:
3636 = ((2000000 / 5) / 10) / 11
А также 2¹¹ = 2048
, так x = 11
это лучшее решение.
Хотите знать, как я могу программно решить это. Я пытался вычленить это уравнение, но с тех пор, как я это сделал, прошло много времени, поэтому я не знаю.
z = (((m / k) / j) / x)
x * z = (m / k) / j
j * (x * z) = m / k
k * (j * (x * z)) = m
...
Немного потерянный сейчас, не уверен, как это доказать:
f(k, j) = ... => [ x, z ]
Вообще я пытаюсь понять, как решить уравнение программно. Просто увидеть реализацию позволит мне понять, не делая ее слишком широкой.
То, что я делал в настоящее время, - это в основном отладчик и ввод некоторого JavaScript, чтобы найти значения, но должен быть лучший способ.
1 ответ
Вы можете сделать итеративный поиск:
x = 1
best_error = infinity
best_x = 0
while True:
z = (((m / k) / j) / x)
error = abs(z - pow(2,x))
if error > best_error
return best_x
best_error = error
best_x = x
x = x+1
Для других отношений есть лучшие способы выбора следующего x
, но для этой конкретной задачи линейный поиск кажется нормальным.