09 września 2018

Szukanie dzielników liczby wprost, odwrócenie mnożenia, pierwsze rezultaty

Pogubiłem się w przykładzie dla większej liczby. Kalkulatory przy tych obliczeniach przestały być pomocne.
Zmodyfikowałem zatem przebieg. Nie muszę brać liczb większych, lecz wybierać wzrastajace wartości. Zatem przebieg jest następujący (to jeszcze nie algorytm).

Mam wartości binarne a, b, liczbę binarną N, oraz kontrolny schemat W (niepotrzebny, ale służy do testowania).
Mam już wyznaczone najbardziej znaczące cyfry a i b.
Zwiększam a i b dwukrotnie i przesuwam o jedną pozycję ku cyfrom mniej znaczącym. Jeszcze nie znam najmniej znaczących bitów a i b. To mogę być zera lub jedynki, np. gdy a=10001, uzyskamy wzorzec a=0100010 (długość o 2 większa). Teraz chcę dopasować najmniej znaczace bity.
Modyfikuję N (a_{k+1} = 2a_k) by móc porównać z wzorcami dla a, b.
Teraz przypadki dla odpowiednio przyciętego do schematów N:
- kiedy N<a,b, wartości te zostają bez zmian,
- kiedy N>a+b, odejmuję a, b; zwiększam najmniej znaczącą pozycję tych wzorców o 1, ale od N przenoszę tyko jedynkę do schematu W
- w pozostałych przypadkach odejmuję od N któryś ze wzorców a albo b (zwiększając równocześnie o tę wartosć W), zwiększając o jeden najmniej znaczącą cyfrę drugiego schematu.
Wybór wzorca z początku był prosty - upodabniał się do cyfr początkowych a albo b.

Z początku gładko, ale po wyznaczeniu (dokładnym) kilku cyfr binarnych dzielników pojawiły się drobne niuanse. Wartość z N sugerowała istnienie ustawionego bitu, choć wartości a i b miały kończyć się zerami.
Docelowo a, b stają się dzielnikami, nie dbam tu o zgodnosć długości, wyniknie to przy końcu sprawdzania gdy wzorce wypełnią liczbę N do końca. Wtedy wystarczy przyciąć ich długość - kiedy dzielniki są różnej długości jeden z nich kończy się zerami a powinien jedynką. Podczas procesów narzucam równą długość schematów a i b. 

Zatem jest to sposób na wyznaczenie wielu bitów dzielników, ale jeszcze nie do końca skuteczny. Dla testowanej liczby 101-bitowej wyznaczyłem poprawnie po 12 bitów obu dzielników.
Pomyślałem o możliwości zmiany reszty wskazującej stan bitu - raz działa, raz nie. Zatem wyznaczanie dzielników od najbardziej znaczących bitów jest zawodne. Spróbuję od najmniej znaczących pozycji.