Jump to content

Отрицательная база

(Перенаправлено с базы -10 )

Отрицательное основание (или отрицательное основание системы счисления ) может использоваться для построения нестандартной позиционной системы счисления . Как и в других системах разрядной стоимости, каждая позиция имеет кратную соответствующую мощность базы системы; но эта база отрицательна, то есть база b равна −r для некоторого натурального числа r ( r ≥ 2 ).

Системы с отрицательной основой могут содержать все те же числа, что и стандартные системы разрядных значений, но как положительные, так и отрицательные числа представляются без использования знака минус (или, в компьютерном представлении, знакового бита ); этому преимуществу противостоит повышенная сложность арифметических операций. Необходимость хранить информацию, обычно содержащуюся в отрицательном знаке, часто приводит к тому, что число с отрицательной базой оказывается на одну цифру длиннее, чем его эквивалент с положительной базой.

Общие названия позиционных систем счисления с отрицательной основой образуются путем добавления префикса nega- к названию соответствующей системы счисления с положительной основой; например, негатеричная (основание -10) соответствует десятичной (основание 10), негабинарная (основание -2) - двоичной (основание 2), негатеричная (основание -3) - троичная (основание 3) и негачетверичная (основание -4). в четвертичный (основание 4). [1] [2]

Рассмотрим, что подразумевается под представлением 12243 в недесятеричной системе с основанием b , равной −10:

кратные
(−10) 4 = 10,000 (−10) 3 = −1,000 (−10) 2 = 100 (−10) 1 = −10 (−10) 0 = 1
1 2 2 4 3

Представление 12 243 −10 (которое предназначено для недесятеричного представления) эквивалентно 8 163 10 в десятичном представлении, поскольку 10 000 + (−2 000) + 200 + (−40) + 3 = 8 163 .

Примечание

С другой стороны, -8 163 10 в десятичном формате будет записано как 9 977 -10 в недесятичном формате.

Отрицательные числовые основы были впервые рассмотрены Витторио Грюнвальдом в монографии 1885 года, опубликованной в «Giornale di Matematiche» Баттальини . [3] Грюнвальд предложил алгоритмы сложения, вычитания, умножения, деления, извлечения корня, проверки делимости и преобразования системы счисления. Отрицательные основания были позже упомянуты А. Дж. Кемпнером в 1936 году. [4] и более подробно изучен Здиславом Павляком и А. Вакуличем в 1957 году. [5]

Негабинарность была реализована в раннем польском компьютере BINEG UMC ), построенном в 1957–59 годах на основе идей З. Павляка и А. Лазаркевича из Математического института в Варшаве . [6] С тех пор реализации были редкими.

zfp, алгоритм сжатия чисел с плавающей запятой от Ливерморской национальной лаборатории Лоуренса , использует негабинарный код для хранения чисел. Согласно документации zfp: [7]

В отличие от представлений знаковых величин, крайний левый один бит в отрицательном двоичном формате одновременно кодирует знак и приблизительную величину числа. Более того, в отличие от дополнения до двух, числа, малые по величине, имеют много ведущих нулей в негабинарной форме независимо от знака, что облегчает кодирование.

Обозначения и использование

[ редактировать ]

Обозначая базу как −r , каждое целое число a можно однозначно записать как

где каждая цифра d k представляет собой целое число от 0 до r − 1 , а старшая цифра d n > 0 (если только n = 0 ). по основанию -r Расширение a тогда задается строкой d n d n −1 ... d 1 d 0 .

Таким образом, системы с отрицательной базой можно сравнить с представлениями цифр со знаком , такими как сбалансированная троичная система счисления , где система счисления положительна, но цифры взяты из частично отрицательного диапазона. (В таблице ниже цифра значения −1 записана как одиночный символ T.)

Некоторые числа имеют то же представление по основанию -r, что и по основанию r . Например, числа от 100 до 109 имеют одинаковое представление в десятичной и недесятеричной форме. Сходным образом,

и представлено 10001 в двоичном формате и 10001 в негабинарном формате.

Некоторые числа с их разложением по ряду положительных и соответствующих отрицательных оснований:

Десятичный недесятеричный Двоичный Негабинарный тройной отрицательный Сбалансированная тройная система Сбалансированный отрицательный Четвертичный период Негачетвертичный
−15 25 −1111 110001 −120 1220 Т110 11Т0 −33 1301
−5 15 −101 1111 −12 21 Т11 ТТ1 −11 23
−4 16 −100 1100 −11 22 ТТ −10 10
−3 17 −11 1101 −10 10 Т0 10 −3 11
−2 18 −10 10 −2 11 Т1 11 −2 12
−1 19 −1 11 −1 12 Т Т −1 13
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
2 2 10 110 2 2 ТТ 2 2
3 3 11 111 10 120 10 Т0 3 3
4 4 100 100 11 121 11 Т1 10 130
5 5 101 101 12 122 1ТТ 11Т 11 131
6 6 110 11010 20 110 1Т0 110 12 132
7 7 111 11011 21 111 1Т1 111 13 133
8 8 1000 11000 22 112 10Т 10Т 20 120
9 9 1001 11001 100 100 100 100 21 121
10 190 1010 11110 101 101 101 101 22 122
11 191 1011 11111 102 102 11Т 1ТТ 23 123
12 192 1100 11100 110 220 110 1Т0 30 110
13 193 1101 11101 111 221 111 1Т1 31 111
14 194 1110 10010 112 222 1ТТТ ТТ1Т 32 112
15 195 1111 10011 120 210 1TT0 ТТ10 33 113
16 196 10000 10000 121 211 1ТТ1 ТТ11 100 100
17 197 10001 10001 122 212 1Т0Т ТТ0Т 101 101
18 198 10010 10110 200 200 1T00 ТТ00 102 102

Обратите внимание, что, за исключением отрицательных сбалансированных троичных чисел, по основанию -r разложения отрицательных целых чисел имеют четное количество цифр, тогда как разложения по основанию -r неотрицательных целых чисел имеют нечетное количество цифр.

по основанию -r Разложение числа можно найти путем повторного деления на -r , записывая неотрицательные остатки в и объединяем эти остатки, начиная с последнего. Обратите внимание: если a / b равно c с остатком d , то bc + d = a и, следовательно, d = a bc . Чтобы добиться правильного преобразования, значение c должно быть выбрано таким, чтобы d было неотрицательным и минимальным. Для четвертой строки следующего примера это означает, что

должен быть выбран, а не ни

Например, чтобы преобразовать десятичное число 146 в отрицательное:

Читая остатки в обратном порядке, мы получаем отрицательное представление 146 10 : 21102 –3 .

Доказательство: -3 · (-3 · (-3 · (-3 · ( 2 ) + 1 ) + 1 ) + 0 ) + 2 = ((( 2 · (–3) + 1 ) · (–3) + 1 ) · (–3) + 0 ) · (–3) + 2
= 146 10 .

Читая остатки вперед, мы можем получить отрицательное представление с наименьшей значащей цифрой.

Доказательство: 2 + ( 0 + ( 1 + ( 1 + ( 2 ) · -3 ) · -3) · -3 ) · -3 = 146 10 .

Обратите внимание, что в большинстве языков программирования результат (в целочисленной арифметике) деления отрицательного числа на отрицательное число округляется в сторону 0, обычно оставляя отрицательный остаток. В таком случае мы имеем a = (- r ) c + d = (- r ) c + d - r + r = (- r )( c + 1) + ( d + r ) . Потому что | д | < r , ( d + r ) — положительный остаток. Следовательно, чтобы получить правильный результат в таком случае, компьютерные реализации приведенного выше алгоритма должны добавить 1 и r к частному и остатку соответственно.

Пример кода реализации

[ редактировать ]

Негабинарный

[ редактировать ]
static string ToNegabinary(int val)
{
	string result = string.Empty;

	while (val != 0)
	{
		int remainder = val % -2;
		val = val / -2;

		if (remainder < 0)
		{
			remainder += 2;
			val += 1;
		}

		result = remainder.ToString() + result;
	}

	return result;
}
auto to_negabinary(int value)
{
    std::bitset<sizeof(int) * CHAR_BIT > result;
    std::size_t bit_position = 0;

    while (value != 0)
    {
        const auto div_result = std::div(value, -2);

        if (div_result.rem < 0)
            value = div_result.quot + 1;
        else
            value = div_result.quot;

        result.set(bit_position, div_result.rem != 0);

        ++bit_position;
    }

    return result;
}

Отрицательный

[ редактировать ]
static string Negaternary(int val)
{
	string result = string.Empty;

	while (val != 0)
	{
		int remainder = val % -3;
		val = val / -3;

		if (remainder < 0)
		{
			remainder += 3;
			val += 1;
		}

		result = remainder.ToString() + result;
	}

	return result;
}
def negaternary(i: int) -> str:
    """Decimal to negaternary."""
    if i == 0:
        digits = ["0"]
    else:
        digits = []
        while i != 0:
            i, remainder = divmod(i, -3)
            if remainder < 0:
                i, remainder = i + 1, remainder + 3
            digits.append(str(remainder))
    return "".join(digits[::-1])
>>> negaternary(1000)
'2212001'
Общий Лисп
[ редактировать ]
(defun negaternary (i)
  (if (zerop i)
      "0"
      (let ((digits "")
            (rem 0))
        (loop while (not (zerop i)) do
          (progn
            (multiple-value-setq (i rem) (truncate i -3))
            (when (minusp rem)
              (incf i)
              (incf rem 3))
            (setf digits (concatenate 'string (write-to-string rem) digits))))
        digits)))

К любой отрицательной базе

[ редактировать ]
import java.util.ArrayList;
import java.util.Collections;
public ArrayList<Integer> negativeBase(int input, int base) {
    ArrayList<Integer> result_rev = new ArrayList<>();
    int number = input;
    while (number != 0) {
        int i = number % base;
        number /= base;
        if (i < 0) {
            i += Math.abs(base);
            number++;
        }
        result_rev.add(i);
    }
    return Collections.reverse(results_rev.clone());
}

Вышеприведенное дает результат в виде ArrayList целых чисел, поэтому коду не нужно обрабатывать представление базы меньше -10. Чтобы отобразить результат в виде строки, можно выбрать сопоставление базы с символами. Например:

import java.util.stream.Collectors;
final String alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_";
public String toBaseString(ArrayList<Integer> lst) {
    // Would throw exception if base is beyond the 64 possible characters
    return lst.stream().map(n -> alphabet[n]).collect(Collectors.joining(""));
}
АвтоЛисп
[ редактировать ]
(defun negabase (num baz / dig rst)
  ;; NUM is any number.
  ;; BAZ is any number in the interval [-10, -2]. (This is forced by how we do string notation.)
  ;;
  ;; NUM and BAZ will be truncated to an integer if they're floats (e.g. 14.25
  ;; will be truncated to 14, -123456789.87 to -123456789, etc.).
  (if (and (numberp num)
           (numberp baz)
           (<= (fix baz) -2)
           (> (fix baz) -11))
      (progn
        (setq baz (float (fix baz))
              num (float (fix num))
              dig (if (= num 0) "0" ""))
        (while (/= num 0)
               (setq rst (- num (* baz (setq num (fix (/ num baz))))))
               (if (minusp rst)
                   (setq num (1+ num)
                         rst (- rst baz)))
               (setq dig (strcat (itoa (fix rst)) dig)))
        dig)
      (progn
        (prompt
         (cond
           ((and (not (numberp num))
                 (not (numberp baz)))
            "\nWrong number and negabase.")
           ((not (numberp num))
            "\nWrong number.")
           ((not (numberp baz))
            "\nWrong negabase.")
           (t
            "\nNegabase must be inside [-10 -2] interval.")))
        (princ))))

Ускоренный расчет

[ редактировать ]

Следующие алгоритмы предполагают, что

  1. ввод доступен в битовых строках и закодирован (по основанию +2; цифры в ) (как и в большинстве современных цифровых компьютеров),
  2. существуют операции добавления (+) и исключающего ИЛИ (^), которые работают с такими битовыми строками (как и в большинстве современных цифровых компьютеров),
  3. набор выходных цифр является стандартным, т.е. е. с базой ,
  4. вывод кодируется в том же формате битовой строки, но значение мест другое.

Негабинарный

[ редактировать ]

Преобразование в негабинарную систему (основание -2; цифры в ) позволяет использовать замечательный ярлык (реализация C):

uint32_t toNegaBinary(uint32_t value) // input in standard binary
{
	uint32_t Schroeppel2 = 0xAAAAAAAA; // = 2/3*((2*2)^16-1) = ...1010
	return (value + Schroeppel2) ^ Schroeppel2; // eXclusive OR
	// resulting unsigned int to be interpreted as string of elements ε {0,1} (bits)
}

Порт JavaScript для того же быстрого расчета:

function toNegaBinary(value) {
    const Schroeppel2 = 0xAAAAAAAA;
    // Convert as in C, then convert to a NegaBinary String
    return ( ( value + Schroeppel2 ) ^ Schroeppel2 ).toString(2);
}

Алгоритм впервые описан Шреппелем в HAKMEM (1972) под номером 128. В Wolfram MathWorld документирована версия на языке Wolfram Language, написанная Д. Либриком (Ссудзиком). [8]

Негачетвертичный

[ редактировать ]

Преобразование в негачетвертичный (основание -4; цифры в ) позволяет использовать аналогичный ярлык (реализация C):

uint32_t toNegaQuaternary(uint32_t value) // input in standard binary
{
	uint32_t Schroeppel4 = 0xCCCCCCCC; // = 4/5*((2*4)^8-1) = ...11001100 = ...3030
	return (value + Schroeppel4) ^ Schroeppel4; // eXclusive OR
	// resulting unsigned int to be interpreted as string of elements ε {0,1,2,3} (pairs of bits)
}

Порт JavaScript для того же быстрого расчета:

function toNegaQuaternary(value) {
    const Schroeppel4 = 0xCCCCCCCC;
    // Convert as in C, then convert to NegaQuaternary String
    return ( ( value + Schroeppel4 ) ^ Schroeppel4 ).toString(4);
}

Арифметические операции

[ редактировать ]

Ниже описаны арифметические операции для негабинарных чисел; расчеты в более крупных базах аналогичны.

Добавление

[ редактировать ]

Сложение небинарных чисел происходит побитно, начиная с младших битов ; биты каждого слагаемого суммируются с ( сбалансированным троичным ) переносом предыдущего бита (0 в младшем разряде). Затем эта сумма разлагается на выходной бит и переносится на следующую итерацию, как показано в таблице:

Сумма Выход Комментарий
Кусочек Нести
−2 010 −2 0 1 01 −2 −2 возникает только при вычитании.
−1 011 −2 1 1 01 −2
0 000 −2 0 0 00 −2
1 001 −2 1 0 00 −2
2 110 −2 0 −1 11 −2
3 111 −2 1 −1 11 −2 3 происходит только во время сложения.

Например, вторая строка этой таблицы выражает тот факт, что −1 = 1 + 1 × −2; в пятой строке написано 2 = 0 + −1 × −2; и т. д.

Например, чтобы сложить 1010101 −2 (1 + 4 + 16 + 64 = 85) и 1110100 −2 (4 + 16 − 32 + 64 = 52),

Carry:          1 −1  0 −1  1 −1  0  0  0
First addend:         1  0  1  0  1  0  1
Second addend:        1  1  1  0  1  0  0 +
               --------------------------
Number:         1 −1  2  0  3 −1  2  0  1
Bit (result):   1  1  0  0  1  1  0  0  1
Carry:          0  1 −1  0 −1  1 −1  0  0

таким образом, результат равен 110011001 -2 (1 - 8 + 16 - 128 + 256 = 137).

Другой метод

[ редактировать ]

При добавлении двух небинарных чисел каждый раз, когда генерируется перенос, дополнительный перенос должен распространяться на следующий бит. Рассмотрим тот же пример, что и выше

Extra carry:    1  1  1  0  1  0  0  0     
Carry:             0  1  1  0  1  0  0  0
First addend:         1  0  1  0  1  0  1
Second addend:        1  1  1  0  1  0  0 +
               --------------------------
Answer:         1  1  0  0  1  1  0  0  1

Негабинарный полный сумматор

[ редактировать ]

Схема полного сумматора может быть спроектирована для сложения чисел в негабинарном формате. Для вычисления суммы и переносов используется следующая логика: [9]

Увеличение небинарных чисел

[ редактировать ]

Увеличение отрицательного числа можно выполнить по следующей формуле: [10]

(Операции в этой формуле следует интерпретировать как операции над обычными двоичными числами. Например, представляет собой двоичный сдвиг влево на один бит.)

Вычитание

[ редактировать ]

Чтобы вычесть, умножьте каждый бит второго числа на -1 и сложите числа, используя ту же таблицу, что и выше.

Например, чтобы вычислить 1101001 −2 (1 − 8 − 32 + 64 = 25) минус 1110100 −2 (4 + 16 − 32 + 64 = 52),

Carry:          0  1 −1  1  0  0  0
First number:   1  1  0  1  0  0  1
Second number: −1 −1 −1  0 −1  0  0 +
               --------------------
Number:         0  1 −2  2 −1  0  1
Bit (result):   0  1  0  0  1  0  1
Carry:          0  0  1 −1  1  0  0

таким образом, результат равен 100101 −2 (1 + 4 −32 = −27).

Унарное отрицание x можно вычислить как двоичное вычитание из нуля 0 − x .

Умножение и деление

[ редактировать ]

Сдвиг влево умножает на -2, сдвиг вправо делит на -2.

Чтобы умножить, умножайте, как обычные десятичные или двоичные числа, но используя небинарные правила сложения переноса при сложении чисел.

First number:                   1  1  1  0  1  1  0
Second number:                  1  0  1  1  0  1  1 ×
              -------------------------------------
                                1  1  1  0  1  1  0
                             1  1  1  0  1  1  0

                       1  1  1  0  1  1  0
                    1  1  1  0  1  1  0

              1  1  1  0  1  1  0                   +
              -------------------------------------
Carry:        0 −1  0 −1 −1 −1 −1 −1  0 −1  0  0
Number:       1  0  2  1  2  2  2  3  2  0  2  1  0
Bit (result): 1  0  0  1  0  0  0  1  0  0  0  1  0
Carry:           0 −1  0 −1 −1 −1 −1 −1  0 −1  0  0

Для каждого столбца добавьте перенос к номеру и разделите сумму на -2, чтобы получить новый перенос и полученный бит в качестве остатка.

Сравнение небинарных чисел

[ редактировать ]

Негабинарные числа можно сравнивать, слегка изменив обычный беззнаковый двоичный компаратор . При сравнении чисел и , инвертируйте каждый нечетный бит обоих чисел. После этого сравните и используя стандартный беззнаковый компаратор. [11]

Дробные числа

[ редактировать ]

Представление по основанию -r, конечно, может быть вынесено за пределы точки счисления , что позволяет представлять нецелые числа.

Как и в системах с положительной основой, конечные представления соответствуют дробям, в которых знаменатель является степенью основания; повторяющиеся представления соответствуют другим рациональным числам, и по той же причине.

Неуникальные представления

[ редактировать ]

В отличие от систем с положительной базой, где целые числа и конечные дроби имеют неединственное представление (например, в десятичном формате 0,999... = 1 ), в системах с отрицательной базой целые числа имеют только одно представление. Однако существуют рациональные числа с неединственными представлениями. Для цифр {0, 1, ..., t } с самая большая цифра и

у нас есть

а также

Итак, каждое число с конечной дробью добавлено имеет два различных представления.

Например, в отрицательной форме, т.е. и , есть

.

Такие неуникальные представления можно найти, рассмотрев наибольшие и наименьшие возможные представления с целыми частями 0 и 1 соответственно, а затем отметив, что они равны. (Действительно, это работает с любой системой с целочисленной базой.) Таким образом, не однозначно выражаемые рациональные числа имеют форму

с

Воображаемая база

[ редактировать ]

Точно так же, как использование отрицательной базы позволяет представлять отрицательные числа без явного отрицательного знака, использование мнимой базы позволяет представлять гауссовы целые числа . Дональд Кнут предложил четвертичное мнимое основание (основание 2i) в 1955 году. [12]

См. также

[ редактировать ]
  1. ^ Кнут, Дональд (1998), Искусство компьютерного программирования , Том 2 (3-е изд.), стр. 204–205 . Кнут упоминает как недвоичную, так и недесятеричную систему счисления.
  2. ^ Негатернарная система кратко обсуждается в Петковшек, Марко (1990), «Неоднозначные числа плотны», The American Mathematical Monthly , 97 (5): 408–411, doi : 10.2307/2324393 , ISSN   0002-9890 , JSTOR   2324393 , MR   1048915 .
  3. ^ Витторио Грюнвальд. Вокруг арифметики систем счисления с отрицательным основанием, с особым вниманием к системе счисления с отрицательным десятичным числом для изучения ее аналогий с обычной (десятичной) арифметикой, Giornale di Matematiche di Battaglini (1885), 203-221, 367.
  4. ^ Кемпнер, AJ (1936), «Анормальные системы счисления», American Mathematical Monthly , 43 (10): 610–617, doi : 10.2307/2300532 , JSTOR   2300532 , MR   1523792 . Единственная ссылка на отрицательные основания - это сноска на странице 610, которая гласит: «Положительные числа меньше 1 и отрицательные числа могут использоваться в качестве оснований с небольшими изменениями процесса и соответствующими ограничениями на набор используемых цифр».
  5. ^ Павляк, З.; Вакулич, А. (1957), «Использование разложений с отрицательным основанием в арифмометре цифрового компьютера», Bulletin de l'Académie Polonaise des Sciences , Classe III, 5 : 233–236 .
  6. ^ Марчинский, RW, «Первые семь лет польских вычислений». Архивировано 19 июля 2011 г. в Wayback Machine , IEEE Annals of the History of Computing, Vol. 2, № 1, январь 1980 г.
  7. ^ «Алгоритм — документация zfp 1.0.1» . zfp.readthedocs.io .
  8. ^ См. ссылку MathWorld Negabinary. В частности, ссылки:
    • Судзик, М. «Программирование: соревнование по программированию Mathematica». Технологическая конференция Wolfram, 1999 г.
    • Шреппель Р. Пункт 128 в деле Билер М.; Госпер, RW; и Шреппель, Р. ХАКМЕМ . Кембридж, Массачусетс: Лаборатория искусственного интеллекта Массачусетского технологического института, Memo AIM-239, стр. 24 февраля 1972 г. http://www.hakmem.org/#item128.
  9. ^ Фрэнсис, Ю; Суганда, Хутамулия; Шизухуо, Инь (4 сентября 2001 г.). Введение в информационную оптику . Академическая пресса. п. 498. ИСБН  9780127748115 .
  10. ^ «Почему следующая формула увеличивает отрицательное число (число по основанию -2)?» . Проверено 29 августа 2016 г.
  11. ^ Муругесан, Сан (1977). «Негабинарные арифметические схемы, использующие двоичную арифметику». Журнал IEE по электронным схемам и системам . 1 (2): 77. doi : 10.1049/ij-ecs.1977.0005 .
  12. ^ Д. Кнут. Искусство компьютерного программирования. Том 2, 3-е издание. Аддисон-Уэсли. стр. 205, «Позиционные системы счисления».

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8c266fec38b301e0bd7d40b053dddf3f__1715332260
URL1:https://arc.ask3.ru/arc/aa/8c/3f/8c266fec38b301e0bd7d40b053dddf3f.html
Заголовок, (Title) документа по адресу, URL1:
Negative base - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)