У вас есть два целочисленных интервала A = [0, 65535]
и B = [-800, 240]
, и вы хотите отобразить f: A -> B
.
Похоже, вы заявили, что хотите также ограничения:
f(0) == 240
f has a inverse transform g
.
Поскольку число элементов в A
(65536) больше, чем количество элементов в B
(1041),по принципу голубиного отверстия f
не может быть injective
(должно быть x
, y
в A
, так что f(x) == f(y)
).
В результате, f
не может иметьобратное преобразование g
. Это означает, что ограничения не могут найти решение. То есть ваш вопрос не имеет решения .
Также обратите внимание, что ваше преобразование не может быть linear
. Если бы оно было линейным, оно должно было бы удовлетворять f(a*x) == a*f(x)
для каждых a
и x
, и это не может быть правдой, потому что если мы выберем x == 0
и a == 2
, у нас будет f(2*0) == f(0) == 240 == 2 * f(0) == 480
, что явно абсурдно.
Линейность требует f(0) == 0
.
Но тогда давайте проявим гибкость и изменим ваши ограничения ...
Итак, давайте предположим,чем то, что нам не нужно обратное, и что f не должно быть линейным. Возможно отображение, такое как
f(x) := max((-x) + 240, -800)
удовлетворяет вашим потребностям.
В этом случае:
f(0) == max(240, -800) == 240
, первое ограничение выполнено - Мы можем определить
g: B -> A
как g(x) := (-x) + 240
, что удовлетворяет g(240) == 0
и таково, что f(g(x)) == max((x - 240) + 240, -800) == max(x, -800) == x
, что означает f
, является инверсией g
, если ограничено Range
из g
.
В итоге могут подойти следующие решения:
f(x) := max((-x) + 240, -800)
g(x) := (-x) + 240
Только не ожидайте линейности и / или обратных преобразований.
Используя это предположение, у вас есть это:
public static int ConvertA(int oldNumber)
{
if(oldNumber < 0 || oldNumber > 65535)
throw new ArgumentOutOfRangeException();
return Math.Max((-oldNumber) + 240, -800);
}
int newNumber = ConvertA(oldNumber);
public static int ConvertB(int oldNumber)
{
if(oldNumber < -800 || oldNumber > 240)
throw new ArgumentOutOfRangeException();
return -oldNumber + 240;
}
int newNumber = ConvertB(oldNumber);
Имейте в виду, что, как обсуждалось в начале, что ConvertB(ConvertA(65535))
не является 65535
, так как ConvertB
не является обратным к ConvertA