Хорошо бы еще построить схему, инвертирующую
![$2^n-1$ $2^n-1$](https://dxdy-04.korotkov.co.uk/f/f/e/9/fe9381b12bf563bf6fe9b69a65836f3082.png)
входов.
Для начала, построим схему, которая выдает 1, если для заданного
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
включено не менее
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
входов. Возьмем все возможные комбинации из
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
входов, каждую комбинацию соединим в один элемент И, а выходы всех элементов И соединим в одно ИЛИ. Обозначим такую схему как
![$GE(m)$ $GE(m)$](https://dxdy-02.korotkov.co.uk/f/5/8/9/5894aaf2dd3e66fc819b7dee82d9aef682.png)
(greater or equal).
Из рассуждения в предыдущем посте и из того, что мы могли включать входы в любом порядке, следует, что значения на выходах инверторов полностью определяются количеством включенных входов. А именно, на входе
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
-го инвертора должна быть единичка, если количество включенных входов в двоичном представлении имеет
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
-ый бит, равный единичке, считая от старшего бита к младшему. На выходе
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
-го инвертора должен быть, соответственно, инвертированный
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
-ый бит.
Теперь укажем схему, как должны быть эти инверторы соединены, чтобы они действительно вычисляли соответствующие биты двоичного представления количества включенных входов. Строить будем по индукции. Пусть у нас уже
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
инверторов, которые вычисляют первые
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
инвертированных бит. Эти инверторы позволяют построить схемы, выдающие 1 в случае, если первые
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
бит числа включенных входов имеют произвольные заданные значения, а именно, берем элемент И с
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
входами, на которые подаем сигналы либо со входов, либо с выходов этих инверторов. Построим
![$2^k$ $2^k$](https://dxdy-02.korotkov.co.uk/f/9/1/f/91f4e50a1561b60d45e7079ca70f2ed482.png)
таких схем для всех возможных значений
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
бит, они нам все понадобятся. Обозначим эти схемы как
![$A_i$ $A_i$](https://dxdy-01.korotkov.co.uk/f/4/e/b/4ebf880807deff5796460f39aea46f8082.png)
, где
![$0 \le i < 2^k$ $0 \le i < 2^k$](https://dxdy-03.korotkov.co.uk/f/e/e/0/ee0003b55b7f0701c493533402b2687782.png)
.
![$A_i$ $A_i$](https://dxdy-01.korotkov.co.uk/f/4/e/b/4ebf880807deff5796460f39aea46f8082.png)
выдает 1, если первые
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
бит числа включенных входов образуют число
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
. Соединим каждую из
![$A_i$ $A_i$](https://dxdy-01.korotkov.co.uk/f/4/e/b/4ebf880807deff5796460f39aea46f8082.png)
со схемой
![$GE(i \cdot 2^{n-k} + 2^{n-k-1})$ $GE(i \cdot 2^{n-k} + 2^{n-k-1})$](https://dxdy-04.korotkov.co.uk/f/f/e/d/fed6dd954c3e61d41f892a51d82d41a882.png)
элементом И, а потом все эти элементы И, в количестве
![$2^k$ $2^k$](https://dxdy-02.korotkov.co.uk/f/9/1/f/91f4e50a1561b60d45e7079ca70f2ed482.png)
штук, соединим элементом ИЛИ. На выходе ИЛИ будет 1, если
![$k+1$ $k+1$](https://dxdy-04.korotkov.co.uk/f/3/3/3/33359de825e43daa97171e27f6558ae982.png)
-ый бит равен 1, иначе 0. Выход ИЛИ воткнем в
![$k+1$ $k+1$](https://dxdy-04.korotkov.co.uk/f/3/3/3/33359de825e43daa97171e27f6558ae982.png)
-ый инвертор. Конец шага индукции.
Теперь мы можем вычислять каждый бит числа включенных входов, а это позволяет построить схемы, выдающие 1 в том случае, если количество включенных входов в точности равно заданному (в отличие от упоминавшихся в начале схем GE). Обозначим такие схемы как
![$EQ(m)$ $EQ(m)$](https://dxdy-03.korotkov.co.uk/f/2/0/f/20f32c66b5500041e0df0b11aa18d37b82.png)
.
Всё, теперь можно инвертировать входы, например, первый вход. Делать будем так: рассмотрим все возможные наборы значений остальных
![$2^n-2$ $2^n-2$](https://dxdy-04.korotkov.co.uk/f/7/a/f/7af2ee8337fe1dfdd7d74e618cd5c97582.png)
входов. Таких наборов будет
![$2^{2^n-2}$ $2^{2^n-2}$](https://dxdy-04.korotkov.co.uk/f/f/1/8/f187f55610b825afaf535f71df20913b82.png)
штук. Для каждого набора возьмем элемент И, на который подадим тех входы, значение которых равно 1 в этом наборе и схему, выдающую 1, если количество всех включенных входов равно количеству входов, принимающих значение 1 в этом наборе, а потом все эти элементы И соединим в одно ИЛИ. Например, для
![$n=2$ $n=2$](https://dxdy-02.korotkov.co.uk/f/d/a/6/da60d8ce586cf444dfc2735588ee6cab82.png)
будет так:
![$(EQ(0)) \vee (EQ(1) \wedge x2) \vee (EQ(1) \wedge x3) \vee (EQ(2) \wedge x2 \wedge x3)$ $(EQ(0)) \vee (EQ(1) \wedge x2) \vee (EQ(1) \wedge x3) \vee (EQ(2) \wedge x2 \wedge x3)$](https://dxdy-03.korotkov.co.uk/f/6/f/4/6f4260808b69717c3b145942c8452e9b82.png)
. На выходе будет инвертированный первый бит.