Традиционное определение для операции возведения в натуральную степень (или целую положительную) вводится примерно следующим образом:
Возведе́ние в сте́пень — арифметическая операция, первоначально определяемая как результат многократного умножения числа на себя.
На первый взгляд, это определение затруднительно обобщить для целых показателей степени меньших единицы
...
x^3 = x*x*x
x^2 = x*x
x^1 = x
x^0 = ?????
x^-1 = ?????
...
Но если вспомнить, что у операции умножения есть обратная - деление, то напрашивается расширение и для отрицательных показателей степени
...
x^3 = x*x*x
x^-3 = 1/(x*x*x) = 1/x/x/x
...
следовательно
...
x^3 = x*x*x
x^2 = x*x
x^1 = x
x^0 = ?
x^-1 = 1/x
x^-2 = 1/x/x
x^-3 = 1/x/x/x
...
Но всё ещё открытым остаётся вопрос для 0
: с одной стороны, на место ?
напрашивается 1
, но с другой, такое определение остаётся не вполне симметричным для положительных и отрицательных значений...
Поэтому при внимательном рассмотрении возникает вполне естественно желание слегка видоизменить и усовершенствовать исходное
...
x^3 = 1*x*x*x
x^2 = 1*x*x
x^1 = 1*x
x^0 = 1
x^-1 = 1/x
x^-2 = 1/x/x
x^-3 = 1/x/x/x
...
В таком представлении определение словно обретает стройность вкупе с полнотой:
Возведение числа X в целочисленную степень N — арифметическая операция, определяемая как результат многократного [N по модулю раз] умножения либо деления единицы на число X.
![Ход мыслей Ход мыслей](https://habrastorage.org/getpro/habr/upload_files/255/b43/5e2/255b435e2b8c14791ef0c82246fa05c1.png)
Чуть более общий случай* на языке программирования C#
static double Pow(double x, int pow, double seed = 1d)
{
var value = seed;
if (pow < 0)
for (var i = 0; i > pow; i--) value /= x;
else
for (var i = 0; i < pow; i++) value *= x;
return value;
}
* в общем случае зерно [seed
] может быть отличным от 1
В таком виде определение легко и естественно расширяется на случай 0^0
, о котором издавна ведутся жаркие споры в математическом сообществе.
Из него закономерно следует, что 0^0 = 1
.
Действительно, если мы ни разу не будем умножать единицу на ноль, то в результате останется исходная 1
, но если хоть раз умножим, то уже получим 0
.
Если хорошенько вдуматься, то строго доказать тождество X^0 = 1
невозможно, а причина в том, что мы ведь сами даём определения функциям таким образом, чтобы они обладали удобными в прикладных расчётах свойствами.
То есть при попытке доказать тождество X^0 = 1
различными методами, на самом деле мы лишь демонстрируем, что функция возведения в степень нами же определена именно таким способом, чтобы обладать теми заданными полезными свойствами, через которые и проводится само "доказательство". То есть возникает неявный замкнутый круг.
На вопрос:
Почему
X^0 = 1
?
Честный ответ таков:
X^0 = 1
по определению!
Тут уместно спросить:
Но почему же выбрано именно такое определение?
На что приемлем ответ:
Потому что оно во многом стройное (смотреть иллюстрации выше) и обладает рядом замечательных свойств, очень уместных в практических вычислениях.
Если, скажем, определить X^0
иначе, то частично сломается свойство умножения степеней с одинаковыми основаниями X^M * X^N = X^(M+N)
(а именноX^0 * X^N = X^N
), что будет лишь усложнять вычисления без какой-либо смысловой ценности.
Аналогичным образом легко рассмотреть функцию целочисленного умножения через сложение и вычитание с нулевым зерном
...
x*3 = 0 + x + x + x
x*2 = 0 + x + x
x*1 = 0 + x
x*0 = 0
x*-1 = 0 - x
x*-2 = 0 - x - x
x*-3 = 0 - x - x - x
...
static double Mul(double x, int scale, double seed = 0d)
{
var value = seed;
if (pow < 0)
for (var i = 0; i > scale; i--) value -= x;
else
for (var i = 0; i < scale; i++) value += x;
return value;
}
Умножение произвольного числа X на целое число N — арифметическая операция, определяемая как результат многократного [N по модулю раз] сложения либо вычитания нуля с числом X.
Из определения органично вытекает тождество X*0 = 0
.
В самом деле, если к нулю ничего не прибавлять и ничего из нуля не вычитать, то 0
в итоге и останется!
Похожим способом можно взглянуть на функции сложения и вычитания через функции инкремента и декремента, но в качестве зерна будет выступать уже само число.
Сложение
...
x + 3 = x + 1 + 1 + 1
x + 2 = x + 1 + 1
x + 1 = x + 1
x + 0 = x
x +(-1) = x - 1
x +(-2) = x - 1 - 1
x +(-3) = x - 1 - 1 - 1
...
static double Add(double x, int shift)
{
var value = x;
if (pow < 0)
for (var i = 0; i > shift; i--) value -= 1;
else
for (var i = 0; i < shift; i++) value += 1;
return value;
}
Вычитание
...
x - 3 = x - 1 - 1 - 1
x - 2 = x - 1 - 1
x - 1 = x - 1
x - 0 = x
x -(-1) = x + 1
x -(-2) = x + 1 + 1
x -(-3) = x + 1 + 1 + 1
...
static double Sub(double x, int shift)
{
var value = x;
if (pow < 0)
for (var i = 0; i > shift; i--) value += 1;
else
for (var i = 0; i < shift; i++) value -= 1;
return value;
}
И для полноты следует вспомнить функцию факториала и доопределить её для 0
. С отрицательными аргументами становится сложнее, поскольку из общей формулы возникают бесконечные произведения, для которых традиционные методы вычислений уже во многом не определены.
n! = 1 * [(n - 0)*(n - 1)*(n - 2)*...*3*2*1]
...
3! = 1 * (3*2*1)
2! = 1 * (2*1)
1! = 1 * (1)
0! = 1
...
Благодарю за прочтение!
Надеюсь, что рассмотренные примеры помогут читателю подружиться с тождеством X^0 = 1
.
Зеркала статьи: