• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mart, (Suma Lustrzanych Liczb Binarnych (x)(n0)(x))/Generator Liczb Złożonych/Filtr Binarny?

Aruba Cloud - Virtual Private Server VPS
–2 głosów
268 wizyt
pytanie zadane 1 grudnia 2024 w Algorytmy przez CosmoWielki Użytkownik (640 p.)
edycja 4 grudnia 2024 przez CosmoWielki

Mart, Witam, Wszystkich(nie jestem ani Matematykiem, ani Informatykiem)

Jeżeli to jest znane, nawet ogólnie dostępna "Informacja" przepraszam, za "dziwny, kolejny post o prawie tym samym" ( wydaje mi się, jednak że o innym)"

 

Mam pytanie o sumowanie liczb identycznych liczb binarnych w postaci:

(binarna lustrzana x) + (n ilości 0) + (binarna i lustrzana x)

Czy zawsze ten człon liczby binarnej (x), w prostym równaniu

(x)(0)(x) tej {liczby binarnej (x)(0)(x)}, jest podzielna,

za wyjątkiem (niektórych przypadków) przez ten człon (x)

    print("reguła (111 0 111)/(111)?")
    print("reguła (111 00 111)/(111)?")
    print("reguła (111 000 111)/(111)?")

 

Program w Pythonie :

def decimal_to_binary(decimal_number):
    """Konwertuje liczbę dziesiętną na zapis binarny."""
    return bin(decimal_number)[2:]

def binary_to_decimal(binary_number):
    """Konwertuje liczbę binarną na system dziesiętny."""
    return int(binary_number, 2)

def perform_binary_operations(decimal_number):
    """Przeprowadza operacje binarne zgodnie z podanymi zasadami."""
    binary = decimal_to_binary(decimal_number)
    error_count = 0  # Licznik błędów

    # Operacje
    binary_results = []
    for i in range(1, 101):  # Dodajemy od 1 do 10 zer w środku
        binary_result = binary + "0" * i + binary
        decimal_result = binary_to_decimal(binary_result)
        binary_results.append((i, binary_result, decimal_result))

    # Wyniki
    print(f"Badana liczba: {decimal_number}, liczba bitów: {len(decimal_to_binary(decimal_number))}")
    print(f"Schemat binarny: {decimal_to_binary(decimal_number)}")
    for idx, (i, binary_result, decimal_result) in enumerate(binary_results, start=1):
        factor = decimal_number
        divisible = decimal_result // factor
        product = factor * divisible  # Wynik mnożenia liczb z drugiego nawiasu
        equality_check = "OK" if product == decimal_result else "BŁĄD"
        if equality_check == "BŁĄD":
            error_count += 1  # Zliczanie błędów
        print(f"{idx}. ({decimal_result}) = ({factor} * {divisible}) = ({product}) [{equality_check}]")

    # Podsumowanie błędów
    print(f"\nLiczba błędów: {error_count}")
    
# Główna funkcja programu
if __name__ == "__main__":
    print("MART, Generator Liczb Złożonych/Suma Liczb Binarnych?")
    print("reguła (111 0 111)/(111)?")
    print("reguła (111 00 111)/(111)?")
    print("reguła (111 000 111)/(111)?")
    print(",,,,,,,,,,,,,,,,,,,,,,,,,,,,,")
    number = int(input("Podaj liczbę dziesiętną: "))
    perform_binary_operations(number)

W postaci lewa strona = prawej:

Podaj liczbę dziesiętną: 11
Badana liczba: 11, liczba bitów: 4
Schemat binarny: 1011
1. (363) = (11 * 33) = (363) [OK] 101101011
2. (715) = (11 * 65) = (715) [OK] 1011001011
3. (1419) = (11 * 129) = (1419) [OK] 10110001011

GDYBY , TO BYŁO REGUŁĄ? Stworzyli byśmy "Algorytm Liczb Złożonych"

Kod programu dla trybu A)

Wprowadza:

    Liczbę zer (ks) – stała liczba zer (od 0 do maksymalnej liczby).
    Liczbę n – ilość liczb do wygenerowania (kolejne liczby n1, n2, ..., nm).

Program generuje wzór (n)(ks)(n) dla podanej liczby n oraz stałej liczby zer.

Program w Pythonie:

import random
 
def is_prime(n, k=5):
    """
    Test Rabina-Millera do sprawdzania, czy liczba jest pierwsza.
    - n: liczba do przetestowania.
    - k: liczba iteracji testu (im większa, tym większa dokładność).
    """
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False
 
    # Rozkład n-1 na d * 2^r
    r, d = 0, n - 1
    while d % 2 == 0:
        r += 1
        d //= 2
 
    # Test główny
    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True
 
def decimal_to_binary(decimal_number):
    """Konwertuje liczbę dziesiętną na zapis binarny."""
    return bin(decimal_number)[2:]
 
def binary_to_decimal(binary_number):
    """Konwertuje liczbę binarną na system dziesiętny."""
    return int(binary_number, 2)
 
def generate_nksn(n, ks, count):
    """
    Generuje liczby w trybie (n)(ks)(n).
    - n: liczba początkowa w systemie dziesiętnym.
    - ks: stała liczba zer.
    - count: liczba kolejnych wartości n do wygenerowania.
    """
    results = []
    prime_count = 0  # Licznik liczb pierwszych
    composite_count = 0  # Licznik liczb złożonych
    for i in range(count):
        current_n = decimal_to_binary(n + i)  # Liczba n w systemie binarnym
        binary_result = current_n + "0" * ks + current_n
        decimal_result = binary_to_decimal(binary_result)
        primality = "(p)" if is_prime(decimal_result) else "(z)"
        
        # Zliczanie liczb pierwszych i złożonych
        if primality == "(p)":
            prime_count += 1
        else:
            composite_count += 1
        
        results.append((binary_result, decimal_result, primality))
    
    return results, prime_count, composite_count
 
# Główna funkcja programu
if __name__ == "__main__":
    print("Tryb A: Generowanie liczb w postaci (n)(ks)(n) z weryfikacją pierwszości")
    print("Tryb A: wg. Mart'a")
    print("-" * 60)
 
    try:
        ks = int(input("Podaj liczbę stałych zer (ks): "))
        n = int(input("Podaj początkową liczbę (n): "))
        count = int(input("Podaj liczbę kolejnych n do wygenerowania: "))
 
        results, prime_count, composite_count = generate_nksn(n, ks, count)
 
        print(f"{'Liczba binarna':<40} {'Liczba dziesiętna':>20} {'Pierwszość':>10}")
        print("-" * 70)
        for binary, decimal, primality in results:
            print(f"{binary:<40} {decimal:>20} {primality:>10}")
        
        # Podsumowanie wyników
        print("-" * 70)
        print(f"Liczba liczb pierwszych (p): {prime_count}")
        print(f"Liczba liczb złożonych (z): {composite_count}")
    except ValueError as e:
        print(f"Błąd: {e}")

 

Kod programu dla trybu B)

Tryb B działa w sposób analogiczny do trybu A,

ale uwzględnia zmienną liczbę zer (kn) między dwiema stałymi wartościami (x).
Test Rabina-Millera gwarantuje oznaczenie liczb jako p (pierwsza) lub z (złożona).

Program w Pythonie:

import random
 
def is_prime(n, k=5):
    """
    Test Rabina-Millera do sprawdzania, czy liczba jest pierwsza.
    - n: liczba do przetestowania.
    - k: liczba iteracji testu (im większa, tym większa dokładność).
    """
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False
 
    # Rozkład n-1 na d * 2^r
    r, d = 0, n - 1
    while d % 2 == 0:
        r += 1
        d //= 2
 
    # Test główny
    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True
 
def decimal_to_binary(decimal_number):
    """Konwertuje liczbę dziesiętną na zapis binarny."""
    return bin(decimal_number)[2:]
 
def binary_to_decimal(binary_number):
    """Konwertuje liczbę binarną na system dziesiętny."""
    return int(binary_number, 2)
 
def generate_xknx(x, max_zeros):
    """
    Generuje liczby w trybie (x)(kn)(x).
    - x: stała liczba w systemie dziesiętnym.
    - max_zeros: maksymalna liczba zer (kn).
    """
    x_binary = decimal_to_binary(x)
    results = []
    prime_count = 0  # Licznik liczb pierwszych
    composite_count = 0  # Licznik liczb złożonych
    for kn in range(max_zeros + 1):  # Ilość zer od 0 do max_zeros
        binary_result = x_binary + "0" * kn + x_binary
        decimal_result = binary_to_decimal(binary_result)
        primality = "(p)" if is_prime(decimal_result) else "(z)"
        
        # Zliczanie liczb pierwszych i złożonych
        if primality == "(p)":
            prime_count += 1
        else:
            composite_count += 1
        
        results.append((kn, binary_result, decimal_result, primality))
    
    return results, prime_count, composite_count
 
# Główna funkcja programu
if __name__ == "__main__":
    print("Tryb B: Generowanie liczb w postaci (x)(kn)(x) z weryfikacją pierwszości")
    print("Tryb B: wg. Mart'a")
    print("-" * 60)
 
    try:
        x = int(input("Podaj liczbę stałą (x): "))
        max_zeros = int(input("Podaj maksymalną liczbę zer (kn): "))
 
        results, prime_count, composite_count = generate_xknx(x, max_zeros)
 
        for kn, binary, decimal, primality in results:
            # Wyświetlanie wyniku w dwóch wierszach
            print(f"({kn}) ({binary})")
            print(f"({decimal}) {primality}")
            print("-" * 30)  # Separator dla czytelności
        
        # Podsumowanie wyników
        print("-" * 60)
        print(f"Liczba liczb pierwszych (p): {prime_count}")
        print(f"Liczba liczb złożonych (z): {composite_count}")
    except ValueError as e:
        print(f"Błąd: {e}")

 

Czy to jest "Reguła? czy "Przypadek?. To jest Pytanie?


 

komentarz 3 grudnia 2024 przez CosmoWielki Użytkownik (640 p.)

Jeszcze raz co do samego (x)(0n)(x), początkowo przyjąłem, że rzeczywiście (x) po lewej i (x) po prawej są identyczne, a nawet bliźniacze, ale gdy zrozumiałem, jak układają się potęgi liczby 2, pierwsza od prawej 2^0 np dla liczby

(1101)(000)(1101) 

(1024,512,0,128)(0,0,0)(8,4,0,1)

Identyczne są Tylko w zapisie binarnym, ale to tylko tak piszę, bo wszystko zależy od interpretacji i jest po prostu względne.

Co do algorytmu, jezeli każdy wyraz binarny (n)(0n)(n) lub jak kto (xn)(n0)(xn) jest liczbą złożoną, za wyjątkiem tylku 5 liczb Fermata, to taki algorytm byłby strukturalnie uporządkowany i bardzo przewidywalny, przy założeniu, że na pewno tylko te 5 liczb jest rzeczywiście pierwszymi( ja tego nie potwierdziłem i pewnie nigdy nie zdołam), do tego "to z tym przesunięciem", wiemy od razu, że to (xn) z lewej jest podzielne zawsze przez to (xn) z prawej, nawet dla tych 5 liczb pierwszych. To jak myślisz ile liczb złożonych wykluczymy w stosunku do liczb pierwszych już samym zapisem binarnym? Gdzie zapis dziesiętny nie jest już tak klarowny jak ten binarny. 

(To moje przemyślenia, jak wielkorotnie pisałem, nie jestem ani informatykiem, ani matematykiem)  

Tak jak opisałeś zapis:

11010001101 ( widać od razu że podzielna?)

1677 (a tu nadal widzisz tą podzielność?)

Dlatego taki prosty algorytm liczb złożonych jest potrzebny, nawet do filtracji nazwijmy to binarnej.

komentarz 3 grudnia 2024 przez adrian17 Mentor (352,580 p.)

za wyjątkiem tylku 5 liczb Fermata

Liczby Fermata nie są jakimiś specjalnymi magicznymi wyjątkami. Liczba postaci (X)(0)(X) jest podzielna przez X, niezależnie w jakim systemie pozycyjnym użyjesz tą metodę. Jeśli użyjesz "1" jako X, no to "1(000...000)1 jest podzielne przez 1" wciąż jest prawdą, ale "jest podzielne przez 1" nie spełnia definicji liczby złożonej, bo liczba złożona ma się dzielić nie tylko przez 1 i samą siebie. Po prostu nie używaj "1" jako X.

To jak myślisz ile liczb złożonych wykluczymy w stosunku do liczb pierwszych już samym zapisem binarnym?

Nie mam pojęcia co to znaczy.

Jedyne co "odkryłeś" (tu nie ma żadnego algorytmu*) to że jeśli liczbę można zapisać jako (X)(0...0)(X), to dzieli się przez X, a jeśli X>1, to jest złożona. To jedna regułka z... nieskończenie wielu, tak samo jak "jeśli kończy się na 0/2/4/6/8, to dzieli się przez 2 (i jeśli jest >2, to jest złożona)", "jeśli i kończy się na 0 lub 5, to dzieli się przez 5 (i jeśli jest >5, to jest złożona)", "jeśli suma cyfr na pozycjach nieparzystych minus suma cyfr na pozycjach parzystych dzieli się przez 11, to cała liczba dzieli się przez 11 (i jeśli jest >11, to jest złożona)".

* chyba że algorytmem chcesz nazwać też "weź liczbę, doklej zero na końcu, bam jest złożona". No... to _technicznie_ jest algorytm, ale nic ciekawego nie robi, po prostu mnoży przez 10 (jeśli doklejasz 0 w systemie dziesiętnym) kub 2 (w dwójkowym) więc wynik z definicji jest liczbą złożoną.

komentarz 3 grudnia 2024 przez CosmoWielki Użytkownik (640 p.)

Nie wiem co odkryłem, może po prostu pokażę jak liczy ten algorytm z filtrem binarnym, może nic nie liczy, bo w zasadzie całą prace i tak musi wykonać Test Millera-Rabina?

"Mart, Test Pierwszeństwa/Filtr Binarny/Prototyp!!!":

def is_symmetric_binary(n):
    """Sprawdza, czy liczba binarna jest symetryczna."""
    binary_str = bin(n)[2:]  # Zapis binarny liczby (pomijamy '0b' na początku)
    return binary_str == binary_str[::-1]  # Sprawdzenie symetrii

def is_even(n):
    """Sprawdza, czy liczba jest parzysta."""
    return n % 2 == 0

def is_divisible_by_3_or_5(n):
    """Sprawdza, czy liczba jest podzielna przez 3 lub 5."""
    return (n % 3 == 0 or n % 5 == 0) and n not in {3, 5}

def binary_filter(n):
    """Filtruje liczbę na podstawie reguł:
    1. Liczby Fermata są pierwsze.
    2. Liczby parzyste (oprócz 2) są złożone.
    3. Liczby podzielne przez 3 lub 5 (oprócz 3 i 5) są złożone.
    4. Symetryczne liczby binarne (nie Fermata) są złożone.
    """
    fermat_primes = {3, 5, 17, 257, 65537}  # Znane liczby Fermata
    if n in fermat_primes:
        return "Pierwsza (Fermata)"  # Liczba Fermata
    if is_even(n) and n != 2:
        return "Złożona (Parzysta)"  # Wszystkie liczby parzyste, oprócz 2, są złożone
    if is_divisible_by_3_or_5(n):
        return "Złożona (Podzielna przez 3 lub 5)"  # Liczby podzielne przez 3 lub 5
    if is_symmetric_binary(n):
        return "Złożona (Symetryczna)"  # Symetryczne liczby binarne są złożone
    return "Potencjalnie pierwsza"  # Reszta do dalszej weryfikacji

def check_numbers_in_range(x, count):
    """Sprawdza zakres liczb od x po kolei i ocenia je na podstawie filtrów."""
    for i in range(x, x + count):
        result = binary_filter(i)
        print(f"Liczba {i} ({bin(i)[2:]}) - {result}")

# Główna funkcja programu
if __name__ == "__main__":
    print("Mart, Test Pierwszeństwa/Filtr Binarny/Prototyp!!!")
    try:
        x = int(input("Podaj liczbę początkową (x): "))
        count = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))
        
        print(f"\nSprawdzanie liczb od {x} do {x + count - 1}:")
        check_numbers_in_range(x, count)
        
    except ValueError as e:
        print(f"Błąd: {e}. Wprowadź poprawne liczby.")

Podaj liczbę początkową (x):
1
Podaj ilość kolejnych liczb do sprawdzenia:
30

Sprawdzanie liczb od 1 do 30:
Liczba 1 (1) - Złożona (Symetryczna)
Liczba 2 (10) - Potencjalnie pierwsza
Liczba 3 (11) - Pierwsza (Fermata)
Liczba 4 (100) - Złożona (Parzysta)
Liczba 5 (101) - Pierwsza (Fermata)
Liczba 6 (110) - Złożona (Parzysta)
Liczba 7 (111) - Złożona (Symetryczna)
Liczba 8 (1000) - Złożona (Parzysta)
Liczba 9 (1001) - Złożona (Podzielna przez 3 lub 5)
Liczba 10 (1010) - Złożona (Parzysta)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(Dalej musiałem wprowadzić kilka warunków)

Mart, Test Pierwszeństwa/Filtr Binarny/NEXT!!!:

import random

def is_symmetric_binary(n):
    """Sprawdza, czy liczba binarna jest symetryczna."""
    binary_str = bin(n)[2:]  # Zapis binarny liczby (pomijamy '0b' na początku)
    return binary_str == binary_str[::-1]  # Sprawdzenie symetrii

def has_central_one(binary_str):
    """Sprawdza, czy centralny bit (lub bity) liczby symetrycznej to 1."""
    length = len(binary_str)
    if length % 2 == 1:  # Liczba o nieparzystej długości
        return binary_str[length // 2] == '1'
    else:  # Liczba o parzystej długości
        central_bits = binary_str[length // 2 - 1:length // 2 + 1]
        return '1' in central_bits

def is_even(n):
    """Sprawdza, czy liczba jest parzysta."""
    return n % 2 == 0

def is_divisible_by_3_or_5(n):
    """Sprawdza, czy liczba jest podzielna przez 3 lub 5."""
    return (n % 3 == 0 or n % 5 == 0) and n not in {3, 5}

def miller_rabin_test(n, k=5):
    """
    Test Millera-Rabina do sprawdzania pierwszości.
    - n: liczba do przetestowania.
    - k: liczba iteracji testu (im większa, tym większa dokładność).
    """
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False

    # Rozkład n-1 na d * 2^r
    r, d = 0, n - 1
    while d % 2 == 0:
        r += 1
        d //= 2

    # Główny test
    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

def binary_filter_with_primality_check(n):
    """
    Filtruje liczbę na podstawie reguł i przeprowadza test Millera-Rabina dla potencjalnie pierwszych.
    """
    fermat_primes = {3, 5, 17, 257, 65537}  # Znane liczby Fermata
    if n in fermat_primes:
        return "Pierwsza (Fermata)"  # Liczba Fermata
    if is_even(n) and n != 2:
        return "Złożona (Parzysta)"  # Wszystkie liczby parzyste, oprócz 2, są złożone
    if is_divisible_by_3_or_5(n):
        return "Złożona (Podzielna przez 3 lub 5)"  # Liczby podzielne przez 3 lub 5
    if is_symmetric_binary(n):
        binary_str = bin(n)[2:]
        if has_central_one(binary_str):
            # Przeprowadzamy test Millera-Rabina dla potencjalnie pierwszych
            if miller_rabin_test(n):
                return "Pierwsza (Symetryczna, centralny bit = 1)"
            else:
                return "Złożona (Symetryczna, centralny bit = 1)"
        else:
            return "Złożona (Symetryczna, centralny bit ≠ 1)"
    # Sprawdzamy potencjalnie pierwsze za pomocą testu Millera-Rabina
    if miller_rabin_test(n):
        return "Pierwsza"
    return "Złożona"

def check_numbers_in_range(x, count):
    """Sprawdza zakres liczb od x po kolei i ocenia je na podstawie filtrów i testów."""
    for i in range(x, x + count):
        result = binary_filter_with_primality_check(i)
        print(f"Liczba {i} - {result}")

# Główna funkcja programu
if __name__ == "__main__":
    print("Mart, Test Pierwszeństwa/Filtr Binarny/NEXT!!!")
    try:
        x = int(input("Podaj liczbę początkową (x): "))
        count = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))
        
        print(f"\nSprawdzanie liczb od {x} do {x + count - 1}:")
        check_numbers_in_range(x, count)
        
    except ValueError as e:
        print(f"Błąd: {e}. Wprowadź poprawne liczby.")


Podaj liczbę początkową (x):
1000000000000
Podaj ilość kolejnych liczb do sprawdzenia:
100

Sprawdzanie liczb od 1000000000000 do 1000000000099:
Liczba 1000000000000 - Złożona (Parzysta)
Liczba 1000000000001 - Złożona
Liczba 1000000000002 - Złożona (Parzysta)
Liczba 1000000000003 - Złożona
Liczba 1000000000004 - Złożona (Parzysta)
Liczba 1000000000005 - Złożona (Podzielna przez 3 lub 5)
Liczba 1000000000006 - Złożona (Parzysta)
Liczba 1000000000007 - Złożona
Liczba 1000000000008 - Złożona (Parzysta)
Liczba 1000000000009 - Złożona
Liczba 1000000000010 - Złożona (Parzysta)
Liczba 1000000000011 - Złożona (Podzielna przez 3 lub 5)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

komentarz 3 grudnia 2024 przez CosmoWielki Użytkownik (640 p.)
edycja 4 grudnia 2024 przez CosmoWielki

PRZEPRASZAM MUSZĘ OD NASTĘPNEGO KOMENTARZA,( BO NIE ZMIESZCZĘ)

"Mart, Test Pierwszeństwa/Filtr Binarny/MAYBE!!!":

 

import random

def is_symmetric_binary(n):
    """Sprawdza, czy liczba binarna jest symetryczna."""
    binary_str = bin(n)[2:]  # Zapis binarny liczby (pomijamy '0b' na początku)
    return binary_str == binary_str[::-1]  # Sprawdzenie symetrii

def has_central_one(binary_str):
    """Sprawdza, czy centralny bit (lub bity) liczby symetrycznej to 1."""
    length = len(binary_str)
    if length % 2 == 1:  # Liczba o nieparzystej długości
        return binary_str[length // 2] == '1'
    else:  # Liczba o parzystej długości
        central_bits = binary_str[length // 2 - 1:length // 2 + 1]
        return '1' in central_bits

def is_even(n):
    """Sprawdza, czy liczba jest parzysta."""
    return n % 2 == 0

def is_divisible_by_3_or_5(n):
    """Sprawdza, czy liczba jest podzielna przez 3 lub 5."""
    return (n % 3 == 0 or n % 5 == 0) and n not in {3, 5}

def miller_rabin_test(n, k=5):
    """
    Test Millera-Rabina do sprawdzania pierwszości.
    - n: liczba do przetestowania.
    - k: liczba iteracji testu (im większa, tym większa dokładność).
    """
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False

    # Rozkład n-1 na d * 2^r
    r, d = 0, n - 1
    while d % 2 == 0:
        r += 1
        d //= 2

    # Główny test
    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

def binary_filter_with_primality_check(n):
    """
    Filtruje liczbę na podstawie reguł i przeprowadza test Millera-Rabina dla potencjalnie pierwszych.
    Zwraca True, jeśli liczba jest pierwsza.
    """
    fermat_primes = {3, 5, 17, 257, 65537}  # Znane liczby Fermata
    if n in fermat_primes:
        return True  # Liczba Fermata jest pierwsza
    if is_even(n) and n != 2:
        return False  # Wszystkie liczby parzyste, oprócz 2, są złożone
    if is_divisible_by_3_or_5(n):
        return False  # Liczby podzielne przez 3 lub 5 są złożone
    if is_symmetric_binary(n):
        binary_str = bin(n)[2:]
        if has_central_one(binary_str):
            # Przeprowadzamy test Millera-Rabina dla potencjalnie pierwszych
            return miller_rabin_test(n)
        else:
            return False  # Symetryczna z centralnym bitem ≠ 1 jest złożona
    # Sprawdzamy potencjalnie pierwsze za pomocą testu Millera-Rabina
    return miller_rabin_test(n)

def check_numbers_in_range(x, count):
    """Sprawdza zakres liczb od x po kolei i wypisuje tylko liczby pierwsze."""
    print(f"Liczby pierwsze w zakresie od {x} do {x + count - 1}:")
    for i in range(x, x + count):
        if binary_filter_with_primality_check(i):
            print(i)

# Główna funkcja programu
print("Mart, Test Pierwszeństwa/Filtr Binarny/MAYBY!!!")
if __name__ == "__main__":
    try:
        x = int(input("Podaj liczbę początkową (x): "))
        count = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))
        
        print()
        check_numbers_in_range(x, count)
        
    except ValueError as e:
        print(f"Błąd: {e}. Wprowadź poprawne liczby.")

komentarz 3 grudnia 2024 przez CosmoWielki Użytkownik (640 p.)
edycja 4 grudnia 2024 przez CosmoWielki

Mi wydaje się,ze szuka trochę lepiej, w sumie tysięczne cyfrowe liczby znajduje, może nie potrzebnie zamienia na dziesiętne, może wystarczy zamieniać tylko  pierwsze, może gdyby przystosować Test M-R od razu do liczb binarnych?

intrygujące jest, że w tych liczbach zmienia się sama końcówka:

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111448883
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111448891
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111449087
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111449507
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111449773
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111450161
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111450979

https://youtube.com/shorts/6LeWv-8fHTA?feature=shared

Istotne, nie używa Bibliotek!!!

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 1,074 wizyt
pytanie zadane 5 stycznia 2020 w Python przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
0 odpowiedzi 339 wizyt
pytanie zadane 10 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 2,625 wizyt

93,329 zapytań

142,323 odpowiedzi

322,397 komentarzy

62,658 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...