Negatif taban - Negative base

Bir negatif taban (veya negatif sayı tabanı ) bir inşa etmek için kullanılabilecek standart olmayan konumsal numarası sistemi . Diğer yer-değer sistemleri gibi, her konum, sistem tabanının uygun gücünün katlarını tutar; fakat bu taban negatiftir - yani, b bazı r ( r ≥ 2 ) doğal sayısı için -r'ye eşittir .

Negatif tabanlı sistemler, standart yer değeri sistemleriyle aynı sayıları barındırabilir, ancak hem pozitif hem de negatif sayılar, bir eksi işareti (veya bilgisayar gösteriminde bir işaret biti ) kullanılmadan temsil edilir ; bu avantaj, aritmetik işlemlerin artan karmaşıklığı ile karşılanmaktadır. Normalde negatif bir işaretin içerdiği bilgileri saklama ihtiyacı, genellikle negatif tabanlı bir sayının pozitif tabanlı eşdeğerinden bir basamak daha uzun olmasına neden olur.

Negatif tabanlı konumsal sayı sistemleri için ortak adlar , karşılık gelen pozitif tabanlı sistemin adının önüne negatif ön eki getirilerek oluşturulur ; örneğin, negadecimal (baz -10) karşılık için ondalık (10 tabanı), negabinary (baz-2) için ikili (taban 2), negaternary (baz-3) için üçlü (baz 3) ve negaquaternary (baz -4) için dörtlü (baz 4).

Örnek

Temsil ile ne kastedildiğini düşünün 12243 baz negadecimal sisteminde b -10:

katları
(-10) 4 = 10.000 (−10) 3 = −1,000 (−10) 2 = 100 (-10) 1 = -10 (−10) 0 = 1
1 2 2 4 3

10.000 + (−2.000) + 200 + (−40) + 3 = 8.163 , temsilNegadecimal gösterimde 12.243 −10 eşdeğerdir8.163 10 ondalık gösterimde,-8,163 10 ondalık olarak yazılır9.977 -10 negadecimal içinde.

Tarih

Negatif sayısal tabanlar ilk olarak Vittorio Grünwald tarafından Giornale di Matematiche di Battaglini'de yayınlanan 1885 tarihli bir monografide ele alındı . Grünwald, toplama, çıkarma, çarpma, bölme, kök çıkarma, bölünebilirlik testleri ve sayı tabanı dönüştürme işlemlerini gerçekleştirmek için algoritmalar verdi. Negatif bazlar daha sonra 1936'da AJ Kempner tarafından geçerken bahsedilmiş ve 1957'de Zdzisław Pawlak ve A. Wakulicz tarafından daha ayrıntılı olarak incelenmiştir .

Negabinary erken hayata geçirildi Polonyalı bilgisayara BINEG (ve UMC dan Z. Pawlak ve A. Lazarkiewicz tarafından fikirlere dayanan,) 1957-59 inşa Matematik Enstitüsü içinde Varşova . O zamandan beri uygulamalar nadir olmuştur.

Notasyon ve kullanım

Olarak tabanını gösteren -r , her tamsayı bir benzersiz olarak yazılabilir

her rakam burada d k , 0 ila arasında bir tamsayıdır , r 1 - ve esas basamak d n olup > 0 (sürece , n = 0 ). Baz r genişlemesi bir sonra dize verilir d n d n -1 ... d 1 d 0 .

Negatif tabanlı sistemler bu nedenle, tabanın pozitif olduğu ancak rakamların kısmen negatif bir aralıktan alındığı dengeli üçlü gibi işaretli basamaklı temsillerle karşılaştırılabilir . (Aşağıdaki tabloda −1 değerinin basamağı tek karakter T olarak yazılmıştır.)

Bazı sayılann temel olarak aynı gösterimi -r temel olarak r . Örneğin, 100'den 109'a kadar olan sayılar, ondalık ve negadesimal olarak aynı temsillere sahiptir. Benzer şekilde,

ve ikili olarak 10001 ve negabinary olarak 10001 ile temsil edilir.

Bir dizi pozitif ve karşılık gelen negatif bazda açılımları olan bazı sayılar:

Ondalık Negadesimal İkili negabinary Üçlü Negaternary Dengeli Üçlü Nega Dengeli Üçlü Kuvaterner Negakuaterner
-15 25 -1111 110001 -120 1220 T110 11T0 -33 1301
-5 15 -101 1111 -12 21 T11 TT1 -11 23
-4 16 -100 1100 -11 22 TT 1T -10 10
-3 17 -11 1101 -10 10 T0 10 -3 11
-2 18 -10 10 -2 11 T1 11 -2 12
-1 19 -1 11 -1 12 T T -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 1T TT 2 2
3 3 11 111 10 120 10 T0 3 3
4 4 100 100 11 121 11 T1 10 130
5 5 101 101 12 122 1TT 11T 11 131
6 6 110 11010 20 110 1T0 110 12 132
7 7 111 11011 21 111 1T1 111 13 133
8 8 1000 11000 22 112 10T 10T 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 11T 1TT 23 123
12 192 1100 11100 110 220 110 1T0 30 110
13 193 1101 11101 111 221 111 1T1 31 111
14 194 1110 10010 112 222 1TTT TT1T 32 112
15 195 1111 10011 120 210 1TT0 TT10 33 113
16 196 10000 10000 121 211 1TT1 TT11 100 100
17 197 10001 10001 122 212 1T0T TT0T 101 101
18 198 10010 10110 200 200 1T10 TTT0 102 102

Nega dengeli üçlü hariç, negatif tam sayıların taban −r açılımlarının çift ​​sayıda basamağa sahipken, negatif olmayan tam sayıların taban −r açılımlarının tek sayıda basamağa sahip olduğuna dikkat edin.

Hesaplama

Taban -r bir dizi genişlemesi ile tekrar bölme bulunabilir -r negatif olmayan kalıntılar, kayıt ve son başlayarak bu kalanlar bitiştirme. a /  b , d kalanıyla c ise , o zaman bc + d = a ve dolayısıyla d = a - bc olduğuna dikkat edin . Doğru dönüştürmeye ulaşmak için, c değeri , d negatif olmayacak ve minimum olacak şekilde seçilmelidir . Bu, aşağıdaki örneğin dördüncü satırında örneklenmiştir, burada –5 ÷ –3, 1 kalan 2 yerine 2 kalan 1'e eşit olacak şekilde seçilmelidir.

Örneğin, 146'yı ondalık sayıya dönüştürmek için:

Kalanlar okuma geri 146, bir negaternary temsilini elde 10 : 21102 -3 .

Kanıt: ((( 2  · (–3) + 1 ) · (–3) + 1 ) · (–3) + 0 ) · (–3) + 2 = 146 10 .

Çoğu programlama dilinde , negatif bir sayıyı negatif bir sayıya bölmenin sonucunun (tamsayı aritmetiğinde) 0'a yuvarlandığını ve genellikle negatif bir kalan bıraktığını unutmayın. Böyle bir durumda elimizde a = (− r ) c + d = (− r ) c + dr + r = (− r )( c + 1) + ( d + r ) olur . Çünkü | g | < r , ( d + r ) pozitif kalandır. Bu nedenle, böyle bir durumda doğru sonucu elde etmek için, yukarıdaki algoritmanın bilgisayar uygulamaları , bölüme ve kalanına sırasıyla 1 ve r eklemelidir .

Örnek uygulama kodu

Negabinary'ye

C#
static string ToNegabinary(int value)
{
	string result = string.Empty;

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

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

		result = remainder.ToString() + result;
	}

	return result;
}
C++
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;
}

Negaternary için

C#
static string negaternary(int value)
{
	string result = string.Empty;

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

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

		result = remainder.ToString() + result;
	}

	return result;
}
Visual Basic .NET
Private Shared Function ToNegaternary(value As Integer) As String
	Dim result As String = String.Empty

	While value <> 0
		Dim remainder As Integer = value Mod -3
		value /= -3

		If remainder < 0 Then
			remainder += 3
			value += 1
		End If

		result = remainder.ToString() & result
	End While

	Return result
End Function
piton
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'
Ortak Lisp
(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)))

Herhangi bir negatif tabana

Java
public String negativeBase(int integer, int base) {
    String result = "";
    int number = integer;
    while (number != 0) {
        int i = number % base;
        number /= base;
        if (i < 0) {
            i += Math.abs(base);
            number++;
        }
        result = i + result;
    }
    return result;
}
Otomatik Lisp

[-10 -2] aralığından:

(defun negabase (num baz / dig rst)
  ;; NUM is any number. BAZ is any number in the interval [-10, -2].
  ;;
  ;; 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))))
PHP

Tamsayıdan bazı negatif tabana dönüşüm:

function toNegativeBase($no, $base)
{
    $digits = array();
    $base = intval($base);
    while ($no != 0) {
        $temp_no = $no;
        $no = intval($temp_no / $base);
        $remainder = ($temp_no % $base);

        if ($remainder < 0) {
            $remainder += abs($base);
            $no++;
        }

        array_unshift($digits, $remainder);
    }

    return $digits;
}
Visual Basic .NET
Function toNegativeBase(Number As Integer , base As Integer) As System.Collections.Generic.List(Of Integer)

    Dim digits As New System.Collections.Generic.List(Of Integer)
    while Number <> 0
        Dim remainder As Integer= Number Mod base
        Number = CInt(Number / base)
 
        if remainder < 0 then
            remainder += system.math.abs(base)
            Number+=1
        end if
 
        digits.Insert(0, remainder)
    end while
 
    return digits
end function

Kısayol hesaplama

Aşağıdaki algoritmalar,

  1. girdi, bit dizilerinde mevcuttur ve (taban +2; hanelerdeki rakamlar ) olarak kodlanmıştır ( günümüzün dijital bilgisayarlarının çoğunda olduğu gibi),
  2. bu tür bit dizileri üzerinde çalışan ekleme (+) ve xor (^) işlemleri vardır (günümüz dijital bilgisayarlarının çoğunda olduğu gibi),
  3. çıktı basamakları seti standarttır, i. e. taban ile ,
  4. çıktı aynı bit dizgisi biçiminde kodlanmıştır, ancak yerlerin anlamı başkadır.

Negabinary'ye

Negabinary'ye dönüştürme (taban -2; 'deki rakamlar ) dikkate değer bir kısayol sağlar (C uygulaması):

unsigned int toNegaBinary(unsigned int value) // input in standard binary
{
	unsigned int 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)
}

D. Librik (Szudzik) yüzünden. Bitsel XOR kısmı orijinal olarak Schroeppel'e (1972) dayanmaktadır .

Aynı kısayol hesaplaması için JavaScript bağlantı noktası:

function toNegaBinary(number) {
    var Schroeppel2 = 0xAAAAAAAA;
    // Convert to NegaBinary String
    return ( ( number + Schroeppel2 ) ^ Schroeppel2 ).toString(2);
}

Negakuaterner için

Negakuaterner'e dönüştürme (taban -4; 'deki rakamlar ) benzer bir kısayola izin verir (C uygulaması):

unsigned int toNegaQuaternary(unsigned int value) // input in standard binary
{
	unsigned int 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)
}

Aynı kısayol hesaplaması için JavaScript bağlantı noktası:

function toNegaQuaternary(number) {
    var Schroeppel4 = 0xCCCCCCCC;
    // Convert to NegaQuaternary String
    return ( ( number + Schroeppel4 ) ^ Schroeppel4 ).toString(4);
}

Aritmetik işlemler

Aşağıda negabinary için aritmetik işlemler açıklanmaktadır; daha büyük bazlardaki hesaplamalar benzerdir.

Ek

Negabinary sayıların eklenmesi, en az anlamlı bitlerden başlayarak bit düzeyinde ilerler ; her ekten gelen bitler, önceki bitten (LSB'de 0 olan) taşıma ( dengeli üçlü ) ile toplanır . Bu toplam daha sonra bir çıktı bitine ayrıştırılır ve tabloda gösterildiği gibi bir sonraki yineleme için taşınır:

toplam Çıktı Yorum Yap
Biraz Taşımak
-2 010 -2 0 1 01 -2 -2 sadece çıkarma sırasında gerçekleşir.
-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 sadece ekleme sırasında oluşur.

Bu tablonun ikinci satırı, örneğin, -1 = 1 + 1 × -2; beşinci satır 2 = 0 + -1 × -2 diyor ; vesaire.

Örnek olarak 1010101 −2 (1 + 4 + 16 + 64 = 85) ve 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

yani sonuç 110011001 -2 (1 − 8 + 16 − 128 + 256 = 137).

Diğer yöntem

İki negabinary sayı eklerken, her taşıma oluşturulduğunda, bir sonraki bite fazladan bir taşıma yayılmalıdır. Yukarıdakiyle aynı örneği düşünün

Extra carry:       1  1  0  1  0  0  0     
Carry:          1  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

Negabinary tam toplayıcı

Bir tam toplayıcı devresi negabinary numaralar eklemek için tasarlanmış olabilir. Toplamı hesaplamak için aşağıdaki mantık kullanılır ve şunları taşır:

Negabinary sayıların artması

Negabinary bir sayının arttırılması, aşağıdaki formül kullanılarak yapılabilir:

Çıkarma

Çıkarmak için, ikinci sayının her bitini -1 ile çarpın ve yukarıdaki tabloyu kullanarak sayıları ekleyin.

Örnek olarak, 1101001 −2 (1 − 8 − 32 + 64 = 25) eksi 1110100 −2 (4 + 16 − 32 + 64 = 52) hesaplamak için ,

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

yani sonuç 100101 -2 (1 + 4 −32 = −27).

Tekli olumsuzlama, x , sıfırdan ikili çıkarma olarak hesaplanabilir, 0 − x .

Çarpma ve bölme

Sola kaydırmak -2 ile çarpar, sağa kaydırmak -2 ile böler.

Çarpmak için, normal ondalık veya ikili sayılar gibi çarpın , ancak sayıları eklerken taşımayı eklemek için negabinary kurallarını kullanın.

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

Her bir sütun için, ekleme carry için sayı ve yeni elde etmek için, -2 tarafından toplam ikiye bölünür carry ve bakiye olarak elde edilen bit.

Negabinary sayıları karşılaştırma

Normal bir işaretsiz ikili karşılaştırıcıyı hafifçe ayarlayarak negabinary sayıları karşılaştırmak mümkündür . Sayıları karşılaştırırken ve her iki numara her tek konumlu bit ters çevirme. Bundan sonra, standart bir imzasız karşılaştırıcı kullanarak karşılaştırın ve kullanın.

kesirli sayılar

Taban −r gösterimi, elbette , tamsayı olmayan sayıların temsiline izin vererek, sayı tabanı noktasının ötesine taşınabilir .

Pozitif tabanlı sistemlerde olduğu gibi, sonlandırıcı temsiller, paydanın tabanın gücü olduğu kesirlere karşılık gelir; yinelenen temsiller diğer rasyonellere karşılık gelir ve aynı nedenle.

Benzersiz olmayan temsiller

Tam sayıların ve sonlanan kesirlerin benzersiz olmayan temsillere sahip olduğu pozitif tabanlı sistemlerin aksine (örneğin, ondalık 0.999... = 1 ) negatif tabanlı sistemlerde tamsayılar yalnızca tek bir temsile sahiptir. Bununla birlikte, benzersiz olmayan temsilleri olan rasyoneller vardır. En büyük basamağa sahip {0, 1, ..., t } rakamları için ve

sahibiz

    birlikte

Bu nedenle , sonlanan kesri eklenmiş her sayının iki farklı temsili vardır.

Örneğin, negaternary'de, yani ve , var

.

Bu tür benzersiz olmayan temsiller, sırasıyla 0 ve 1 tamsayı bölümleriyle mümkün olan en büyük ve en küçük temsiller dikkate alınarak ve sonra bunların eşit oldukları not edilerek bulunabilir. (Aslında, bu herhangi bir tamsayı tabanlı sistemle çalışır.) Bu nedenle benzersiz olmayan şekilde ifade edilemeyen rasyoneller, formunkilerdir.

ile birlikte

hayali taban

Negatif bir taban kullanmanın negatif sayıların açık bir negatif işaret olmadan temsiline izin vermesi gibi , sanal bir taban kullanmak da Gauss tamsayılarının temsiline izin verir . Donald Knuth , 1955'te dörtlü hayali tabanı (taban 2i) önerdi .

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar