Приведите алгоритм и обоснуйте правильность метода для представления целого числа N в системе счисления с основанием b, если b может быть нецелым или отрицательным
Алгоритм и обоснование (для вещественного основания bbb с ∣b∣>1|b|>1∣b∣>1). Выделю два естественных случая: b>1b>1b>1 (включая нецелые) и b<−1b<-1b<−1. Общее: будем представлять целое NNN в виде N=∑k≤makbk,ak∈D:={0,1,…,⌈∣b∣⌉−1},
N=\sum_{k\le m} a_k b^k,\qquad a_k\in D:=\{0,1,\dots,\lceil |b|\rceil-1\}, N=k≤m∑akbk,ak∈D:={0,1,…,⌈∣b∣⌉−1},
где mmm — максимально возможная целая степень (см. ниже). Полученное разложение может быть либо конечным (остаток обнулится), либо бесконечным (обычно при иррациональном bbb). 1) Случай b>1b>1b>1. Алгоритм. - Если N=0N=0N=0 — выдаём цифру 000. - Возьмём m=max{k∈Z: bk≤N}.
m=\max\{k\in\mathbb Z:\; b^k\le N\}. m=max{k∈Z:bk≤N}.
- Для k=m,m−1,…k=m,m-1,\dotsk=m,m−1,… выполняем: ak=⌊Nbk⌋,N←N−akbk.
a_k=\left\lfloor\frac{N}{b^k}\right\rfloor,\qquad N\leftarrow N-a_k b^k. ak=⌊bkN⌋,N←N−akbk.
Если после шага N=0N=0N=0, останавливаемся; иначе продолжаем на следующий k−1k-1k−1. Обоснование. - По выбору mmm имеем 1≤Nbm<b1\le \frac{N}{b^m}<b1≤bmN<b, поэтому am=⌊Nbm⌋∈{1,…,⌈b⌉−1}⊂D.
a_m=\left\lfloor\frac{N}{b^m}\right\rfloor\in\{1,\dots,\lceil b\rceil-1\}\subset D. am=⌊bmN⌋∈{1,…,⌈b⌉−1}⊂D.
- После вычитания остаётся остаток r=N−akbk<bk,
r=N-a_k b^k< b^k, r=N−akbk<bk,
поэтому следующий используемый показатель не превосходит k−1k-1k−1 (степень уменьшается хотя бы на единицу). По конструкции в любой момент сумма выписанных членов равна начальной величине NNN и в случае остановки даёт точное конечное представление; если остановки не происходит, последовательность цифр задаёт стандартную бета‑(greedy) экспансию: N=∑k≤makbk.
N=\sum_{k\le m} a_k b^k. N=k≤m∑akbk. 2) Случай b<−1b<-1b<−1. Алгоритм (аналогично, с учётом знака степеней). - Если N=0N=0N=0 — выдаём 000. - Положим m=max{k∈Z: ∣b∣k≤∣N∣}.
m=\max\{k\in\mathbb Z:\; |b|^k\le |N|\}. m=max{k∈Z:∣b∣k≤∣N∣}.
- Для k=m,m−1,…k=m,m-1,\dotsk=m,m−1,… выбираем целую цифру ak∈Da_k\in Dak∈D по правилу ak={⌊Nbk⌋,если bk>0,⌈Nbk⌉,если bk<0,
a_k= \begin{cases} \left\lfloor\frac{N}{b^k}\right\rfloor, & \text{если } b^k>0,\\[4pt] \left\lceil\frac{N}{b^k}\right\rceil, & \text{если } b^k<0, \end{cases} ak={⌊bkN⌋,⌈bkN⌉,еслиbk>0,еслиbk<0,
и обновляем N←N−akbkN\leftarrow N-a_k b^kN←N−akbk. Останавливаемся при N=0N=0N=0 либо продолжаем дальше. Короткое обоснование правильности выбора. - Для bk>0b^k>0bk>0 аналогично случаю b>1b>1b>1 имеем 1≤Nbk<∣b∣1\le\frac{N}{b^k}<|b|1≤bkN<∣b∣, потому ⌊N/bk⌋∈D\lfloor N/b^k\rfloor\in D⌊N/bk⌋∈D. - Для bk<0b^k<0bk<0 дробь x=Nbkx=\frac{N}{b^k}x=bkN лежит в интервале (−∣b∣,−1](-|b|,-1](−∣b∣,−1]. Тогда ⌈x⌉\lceil x\rceil⌈x⌉ даёт целое в интервале {0,1,…,⌈∣b∣⌉−1}=D\{0,1,\dots,\lceil|b|\rceil-1\}=D{0,1,…,⌈∣b∣⌉−1}=D. В обоих случаях выбранная цифра обеспечивает остаток r=N−akbkс ∣r∣<∣b∣k,
r=N-a_k b^k\quad\text{с }|r|<|b|^k, r=N−akbkс∣r∣<∣b∣k,
причём следующий индекс не превосходит k−1k-1k−1. По индукции сумма выписанных членов равна исходному NNN; алгоритм даёт корректную позиционную запись (конечную при обнулении остатка, иначе бесконечную). Замечания. - Выбор алфавита D={0,…,⌈∣b∣⌉−1}D=\{0,\dots,\lceil|b|\rceil-1\}D={0,…,⌈∣b∣⌉−1} стандартен и гарантирует неотрицательные цифры; можно использовать и другие системно допустимые множества цифр при соответствующей корректировке правил. - Для некратных или иррациональных bbb запись целого числа может быть бесконечной (это нормально — это бета‑экспансия). Для некоторых классов оснований (например, целые bbb или некоторые алгебраические числа типа Пизо) представления конечны или периодичны.
Общее: будем представлять целое NNN в виде
N=∑k≤makbk,ak∈D:={0,1,…,⌈∣b∣⌉−1}, N=\sum_{k\le m} a_k b^k,\qquad a_k\in D:=\{0,1,\dots,\lceil |b|\rceil-1\},
N=k≤m∑ ak bk,ak ∈D:={0,1,…,⌈∣b∣⌉−1}, где mmm — максимально возможная целая степень (см. ниже). Полученное разложение может быть либо конечным (остаток обнулится), либо бесконечным (обычно при иррациональном bbb).
1) Случай b>1b>1b>1.
Алгоритм.
- Если N=0N=0N=0 — выдаём цифру 000.
- Возьмём
m=max{k∈Z: bk≤N}. m=\max\{k\in\mathbb Z:\; b^k\le N\}.
m=max{k∈Z:bk≤N}. - Для k=m,m−1,…k=m,m-1,\dotsk=m,m−1,… выполняем:
ak=⌊Nbk⌋,N←N−akbk. a_k=\left\lfloor\frac{N}{b^k}\right\rfloor,\qquad N\leftarrow N-a_k b^k.
ak =⌊bkN ⌋,N←N−ak bk. Если после шага N=0N=0N=0, останавливаемся; иначе продолжаем на следующий k−1k-1k−1.
Обоснование.
- По выбору mmm имеем 1≤Nbm<b1\le \frac{N}{b^m}<b1≤bmN <b, поэтому
am=⌊Nbm⌋∈{1,…,⌈b⌉−1}⊂D. a_m=\left\lfloor\frac{N}{b^m}\right\rfloor\in\{1,\dots,\lceil b\rceil-1\}\subset D.
am =⌊bmN ⌋∈{1,…,⌈b⌉−1}⊂D. - После вычитания остаётся остаток
r=N−akbk<bk, r=N-a_k b^k< b^k,
r=N−ak bk<bk, поэтому следующий используемый показатель не превосходит k−1k-1k−1 (степень уменьшается хотя бы на единицу). По конструкции в любой момент сумма выписанных членов равна начальной величине NNN и в случае остановки даёт точное конечное представление; если остановки не происходит, последовательность цифр задаёт стандартную бета‑(greedy) экспансию:
N=∑k≤makbk. N=\sum_{k\le m} a_k b^k.
N=k≤m∑ ak bk.
2) Случай b<−1b<-1b<−1.
Алгоритм (аналогично, с учётом знака степеней).
- Если N=0N=0N=0 — выдаём 000.
- Положим
m=max{k∈Z: ∣b∣k≤∣N∣}. m=\max\{k\in\mathbb Z:\; |b|^k\le |N|\}.
m=max{k∈Z:∣b∣k≤∣N∣}. - Для k=m,m−1,…k=m,m-1,\dotsk=m,m−1,… выбираем целую цифру ak∈Da_k\in Dak ∈D по правилу
ak={⌊Nbk⌋,если bk>0,⌈Nbk⌉,если bk<0, a_k=
\begin{cases}
\left\lfloor\frac{N}{b^k}\right\rfloor, & \text{если } b^k>0,\\[4pt]
\left\lceil\frac{N}{b^k}\right\rceil, & \text{если } b^k<0,
\end{cases}
ak ={⌊bkN ⌋,⌈bkN ⌉, если bk>0,если bk<0, и обновляем N←N−akbkN\leftarrow N-a_k b^kN←N−ak bk. Останавливаемся при N=0N=0N=0 либо продолжаем дальше.
Короткое обоснование правильности выбора.
- Для bk>0b^k>0bk>0 аналогично случаю b>1b>1b>1 имеем 1≤Nbk<∣b∣1\le\frac{N}{b^k}<|b|1≤bkN <∣b∣, потому ⌊N/bk⌋∈D\lfloor N/b^k\rfloor\in D⌊N/bk⌋∈D.
- Для bk<0b^k<0bk<0 дробь x=Nbkx=\frac{N}{b^k}x=bkN лежит в интервале (−∣b∣,−1](-|b|,-1](−∣b∣,−1]. Тогда ⌈x⌉\lceil x\rceil⌈x⌉ даёт целое в интервале {0,1,…,⌈∣b∣⌉−1}=D\{0,1,\dots,\lceil|b|\rceil-1\}=D{0,1,…,⌈∣b∣⌉−1}=D. В обоих случаях выбранная цифра обеспечивает остаток
r=N−akbkс ∣r∣<∣b∣k, r=N-a_k b^k\quad\text{с }|r|<|b|^k,
r=N−ak bkс ∣r∣<∣b∣k, причём следующий индекс не превосходит k−1k-1k−1. По индукции сумма выписанных членов равна исходному NNN; алгоритм даёт корректную позиционную запись (конечную при обнулении остатка, иначе бесконечную).
Замечания.
- Выбор алфавита D={0,…,⌈∣b∣⌉−1}D=\{0,\dots,\lceil|b|\rceil-1\}D={0,…,⌈∣b∣⌉−1} стандартен и гарантирует неотрицательные цифры; можно использовать и другие системно допустимые множества цифр при соответствующей корректировке правил.
- Для некратных или иррациональных bbb запись целого числа может быть бесконечной (это нормально — это бета‑экспансия). Для некоторых классов оснований (например, целые bbb или некоторые алгебраические числа типа Пизо) представления конечны или периодичны.