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

"def miller_rabin(L, k=5)" (BEZ LOSOWOŚĆ!!!, BEZ RANDOMU) Test MART'a HE HE

–4 głosów
725 wizyt
pytanie zadane 14 marca 2025 w Python przez CosmoWielki Użytkownik (730 p.)
edycja 23 marca 2025 przez CosmoWielki

ŚLEPA ULICZKA OKAZAŁA MIEĆ  WYJŚCIE !!!

Test Millera-Rabina BEZ RANDOMU, BEZ LOSOWOŚCI !!!

CZY CHCESZ SIĘ O TYM DOWIEDZIEĆ ?cheeky

CZTERY NIEZALEŻNE WERSJE PROGRAMU BEZ RANDOMU.!!!

NOWY FILMIK: 

Test Pierwszeństwa Mart'a (Miller-Rabin/BEZ RANDOMU)

Wystarczy zmienić (a) 

a = random.randint(2, L – 2) Tutaj mamy nasze (a)

Gdybym ci powiedział,że: Liczby Pierwsze, to różnica dwóch Określonych Kwadratów S -M=L.  

Film:PRAWO CIĄGU LICZB NIEPARZYSTYCH

Tylko weź znajdź te kwadraty przed samym L, znowu trzeba szukaćwink

Test Paraboliczny, nie jestem matematykiem nie Pytaj mnie co to znaczy He He:

import math
import random
import time
import sys

# Zwiększenie limitu dla dużych liczb (np. 50000 cyfr)
sys.set_int_max_str_digits(50000)

def miller_rabin(n, k=5):  # Test Millera-Rabina z k powtórzeniami
    if n < 2:
        return False
    if n in (2, 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

    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)  # 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 test_pierwiastka_paraboliczna(x, czas_limit=2):
    zero_count = 0
    zero_indices = []  # Lista przechowująca znalezione wartości n
    start_time = time.time()

    print(f"Wartość x: {x}")
    print("L = w^2 - n^2")

    for a in range(1, int(math.isqrt(x)) + 1):
        if time.time() - start_time > czas_limit:
            if miller_rabin(x):  # Jeśli czas minął, sprawdzamy testem M-R
                print(f"{x} | Pierwsza | Zerowe miejsca: 1")
                return True
            else:
                print(f"{x} | Złożona | Zerowe miejsca: >=2")
                return False

        if x % a == 0:  # Znaleziono dzielnik a
            b = x // a  # Drugi dzielnik b

            if (a + b) % 2 == 0 and (b - a) % 2 == 0:
                w = (a + b) // 2  # Obliczenie w
                n = (b - a) // 2  # Obliczenie n
                # Obliczenie w i n z równań
                w = math.isqrt(L + n**2)  # Poprawna definicja w
                n = math.isqrt(w**2 - L)  # Poprawna definicja n

                print(f"a = {a}, b = {b}, w = {w}, n = {n}")
                
                zero_count += 1
                zero_indices.append(n)

                if zero_count >= 2:
                    print(f"Liczba {x} jest złożona (liczba miejsc zerowych >= 2)")
                    return False  # Liczba jest złożona

    return True  # Jeśli znaleziono tylko jedno miejsce zerowe, liczba jest pierwsza

print("#### Test Pierwszeństwa Mart'a (Paraboliczny)")
# Pytamy użytkownika o liczbę
L = int(input("Podaj liczbę do sprawdzenia: "))

# Wywołujemy funkcję i sprawdzamy wynik
wynik = test_pierwiastka_paraboliczna(L)

if wynik is None:
    print(f"{L}: Nie udało się określić (przekroczony czas)")
elif wynik:
    print(f"{L}: Liczba jest pierwsza")
else:
    print(f"{L}: Liczba jest złożona")

Test pierwszeństwa z filtrem Binarnym, w zasadzie krótką mam pamięć, już prawie o nim zapomniałem :

import random
import sys

# Zwiększenie limitu dla dużych liczb (np. 50000 cyfr)
sys.set_int_max_str_digits(50000)

def is_symmetric_binary(n):
    """Sprawdza, czy liczba binarna jest symetryczna."""
    binary_str = n
    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(binary_str):
    """Sprawdza, czy liczba binarna jest parzysta (ostatni bit = 0)."""
    return binary_str[-1] == '0'

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

def is_divisible_by_small_primes(binary_str):
    """Sprawdza, czy liczba binarna jest podzielna przez małe liczby pierwsze (np. 2, 3, 5, 7, 11)."""
    n = int(binary_str, 2)
    small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
    for prime in small_primes:
        if n % prime == 0 and n != prime:
            return True  # Liczba jest podzielna przez małą liczbę pierwszą
    return False

def miller_rabin_test(binary_str, k=5):
    """
    Test Millera-Rabina do sprawdzania pierwszości (przy użyciu binarnego zapisu liczby).
    """
    n = int(binary_str, 2)
    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 has_repeating_blocks(binary_str):
    """Sprawdza, czy liczba binarna ma powtarzające się bloki."""
    length = len(binary_str)
    for i in range(1, length // 2 + 1):
        # Sprawdza, czy początkowy fragment długości i powtarza się
        if length % i == 0 and binary_str[:i] * (length // i) == binary_str:
            return True
    return False

def is_repunit(binary_str):
    """Sprawdza, czy liczba binarna jest liczbą repunitową (składa się z jedynek)."""
    return binary_str == '1' * len(binary_str)

def is_prime_repunit(binary_str):
    """Sprawdza, czy liczba repunitowa jest liczbą pierwszą."""
    n = int(binary_str, 2)
    # Liczba repunitowa jest liczbą pierwszą tylko wtedy, gdy jest postaci 2^p - 1, gdzie p jest liczbą pierwszą.
    p = len(binary_str)  # długość ciągu jedynek to p
    if (2 ** p - 1) == n:
        return miller_rabin_test(binary_str)
    return False

def binary_filter_with_primality_check(binary_str):
    """
    Filtruje liczbę binarną 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
    n = int(binary_str, 2)  # Zamiana na dziesiętną, by sprawdzić w zbiorze Fermata
    if n in fermat_primes:
        return True  # Liczba Fermata jest pierwsza
    if is_even(binary_str) and n != 2:
        return False  # Wszystkie liczby parzyste, oprócz 2, są złożone
    if is_divisible_by_3_or_5(binary_str):
        return False  # Liczby podzielne przez 3 lub 5 są złożone
    if is_divisible_by_small_primes(binary_str):
        return False  # Liczba jest podzielna przez małe liczby pierwsze
    
    # Sprawdzamy liczby repunitowe
    if is_repunit(binary_str):
        return is_prime_repunit(binary_str)
    
    # Filtrujemy liczby z powtarzającymi się blokami
    if has_repeating_blocks(binary_str):
        return False  # Liczba z powtarzającymi się blokami jest złożona
    
    # Filtrujemy liczbę symetryczną z centralnym bitem 1
    if is_symmetric_binary(binary_str):
        if has_central_one(binary_str):
            return miller_rabin_test(binary_str)  # Sprawdzamy pierwszość przy pomocy testu Millera-Rabina
        else:
            return False  # Symetryczna liczba z centralnym bitem ≠ 1 jest złożona
    
    # Sprawdzamy potencjalnie pierwsze za pomocą testu Millera-Rabina
    return miller_rabin_test(binary_str)

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):
        binary_str = bin(i)[2:]  # Zamiana na zapis binarny
        if binary_filter_with_primality_check(binary_str):
            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.")

Ostatni jak zmieszczę test NWD:

import math
import random
import sys

# Zwiększenie limitu dla dużych liczb (np. 50000 cyfr)
sys.set_int_max_str_digits(50000)

def suma_podstaw_kwadratow(L):
    S = 0
    while L > 0:
       x = math.isqrt(L)  # Największa możliwa podstawa kwadratu
       S += x
       L -= x * x  # Odejmujemy jego kwadrat
    return S

def nwd(L, k=5):
    if L < 2:
        return False
    if L in (2, 3):
        return True
    if L % 2 == 0:
        return False

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

    for _ in range(k):
        a = random.randint(2, L - 2)
        x = pow(a, d, L)  # a^d % L
        if x == 1 or x == L - 1:
            continue

        for _ in range(r - 1):
            x = pow(x, 2, L)
            if x == L - 1:
                break
        else:
            return False
    
    return True

def znajdz_nwd(L):
    S = suma_podstaw_kwadratow(L)
    W = math.isqrt(L)  # Pierwiastek całkowity z L
    max_i = math.floor(math.log2(S*W)) + math.floor(math.log2(L))
    najlepszy_dzielnik = math.pi  # Początkowa wartość dla największego dzielnika
    for i in range(0, max_i + 1):  # i od 1 do W
        N = L - (W - i) ** 2  # Wyznaczamy N
        if N <= 0:
            continue  # Pomijamy wartości ujemne lub zerowe
        
        gcd1 = math.gcd(L, N)  # NWD(L, N)
        gcd2 = math.gcd(L, (W - i))  # NWD(L, (W - i)²)

        ## Prawidłowy warunek
        if W**2 == L:
            print(f"Liczba badana L = {L} Kwadratowa, dzielnik = {W}")
            return "DZIELNIK > 1 LICZBA ZŁOŻONA"
        if L%3 == 0:
            print(f"Liczba badana L = {L} Złozona, dzielnik = 3")
            return "DZIELNIK > 1 LICZBA ZŁOŻONA"
        if W**2 == L:
            print(f"Liczba badana L = {L} Kwadratowa, dzielnik = {W}")
            return "DZIELNIK > 1 LICZBA ZŁOŻONA"
        if L%3 == 0:
            print(f"Liczba badana L = {L} Złozona, dzielnik = 3")
            return "DZIELNIK > 1 LICZBA ZŁOŻONA"
        if  najlepszy_dzielnik > math.pi or gcd1 > math.pi and gcd2 > math.pi and gcd1 < L and gcd2 < L:
            najlepszy_dzielnik = max(najlepszy_dzielnik, gcd1, gcd2)
            print(f"Liczba badana L = {L}")
            print(f"Największy znaleziony dzielnik: {najlepszy_dzielnik}")
            print(f"Maks-dzielnik: {max(gcd1,gcd2)}")
            return "DZIELNIK == Liczba naturalna LICZBA ZŁOŻONA"
    
    if najlepszy_dzielnik == math.pi and max(gcd1,gcd2) == 1 and max(gcd1,gcd2) <= math.pi:
        print(f"Liczba badana L = {L}")
        print(f"Największy znaleziony dzielnik: {najlepszy_dzielnik}")
        print(f"Maks-dzielnik: {max(gcd1,gcd2)}")
        return "DZIELNIK == math.pi LICZBA PIERWSZA"
    
    # Jeśli nie znaleziono dzielnika => liczba pierwsza
    
    return "DZIELNIK = 1 (LICZBA PIERWSZA)"

def test_prime(L):
    # Najpierw testujemy za pomocą funkcji NWD, by sprawdzić, czy liczba jest złożona
    nwd_result = znajdz_nwd(L)

    if "LICZBA ZŁOŻONA" in nwd_result:
        print(f"Na podstawie NWD: {nwd_result}")
        return nwd_result

    # Jeśli test NWD mówi, że liczba jest pierwsza, wykonujemy test Miller-Rabin
    mr_result = nwd(L)
    if mr_result:
        print("Na podstawie testu Miller-Rabin: LICZBA PIERWSZA")
        return "LICZBA PIERWSZA"
    else:
        print("Na podstawie testu Miller-Rabin: LICZBA ZŁOŻONA")
        return "LICZBA ZŁOŻONA"

print("#### Test Pierwszeństwa Mart'a (NWD/Miller-Rabin Test) ####")
# Pytamy użytkownika o liczbę
L = int(input("Podaj liczbę do sprawdzenia: "))
wynik = test_prime(L)
print("Wynik:", wynik)

Tyle, znaczy więcej nie zmieszczę jak Ktoś chce niech się nimi pobawi.Miłego dnia. smiley

4
komentarz 15 marca 2025 przez Distracted_bez_hasła Początkujący (370 p.)
Trochę cię tu brakowało.
2
komentarz 16 marca 2025 przez jankustosz1 Nałogowiec (37,030 p.)
Ooo. Mój ulubiony użytkownik na tym forum
komentarz 16 marca 2025 przez jankustosz1 Nałogowiec (37,030 p.)
Jakieś TLDR dzisiejszego odkrycia?
komentarz 20 marca 2025 przez CosmoWielki Użytkownik (730 p.)

Znajdź dzielnik liczby, iloczynu dwóch dużych liczb pierwszych ? :

118627546509380722538989934839657467994992603002143818287417386377114683121329841515148864282728872484355008884889957710778248595483850765399365162671995907902121484632691681629151853366466248009392772736843738792327683549260319029377

za pomocą samego Testu M-R, lub ogólnie znanego programu dostępnego w internecie, może słabo szukałem prawda, nie szukałem, w sumie mała liczba,

#### Test Pierwszeństwa Mart'a (NWD/Miller-Rabin Test) ####
Podaj liczbę do sprawdzenia: 118627546509380722538989934839657467994992603002143818287417386377114683121329841515148864282728872484355008884889957710778248595483850765399365162671995907902121484632691681629151853366466248009392772736843738792327683549260319029377
Liczba badana L = 118627546509380722538989934839657467994992603002143818287417386377114683121329841515148864282728872484355008884889957710778248595483850765399365162671995907902121484632691681629151853366466248009392772736843738792327683549260319029377
Największy znaleziony dzielnik: 344423498776405676502629562652765928595768976289912691659164159195691546165965956195695695619561651561872373641761059
Maks-dzielnik: 344423498776405676502629562652765928595768976289912691659164159195691546165965956195695695619561651561872373641761059
Na podstawie NWD: DZIELNIK == Liczba naturalna LICZBA ZŁOŻONA
Wynik: DZIELNIK == Liczba naturalna LICZBA ZŁOŻONA

Wiem,ze to Pierdoły, ktoś musi się zajmować odkrywanie nawet Głupot, jak takie proste i mało znane działanie jak znaleźć pierwiastek Liczby Kwadratowej nie używając dzielenia:

25-2-4-6-8=5

49-2-4-6-8-10-12=7

64-2-4-6-8-10-12-14=8,

Nie chodzi o to by stwierdzić coś oczywistego,że dana liczba jest pierwsza, bo rzeczywiście Testy ogólnie dostępne i wymyślone przez matematyków są bardzo dokładne, ale o to by iść pod górkę i sprawdzić np dzielniki liczby prostej 77;

#### Test Pierwszeństwa Mart'a (Kwadrat) ####
Podaj liczbę do sprawdzenia: 77
L = 77
M = 1444, sqrt(M) = 38
S = 1521, sqrt(S) = 39
- S (1521) jest kwadratem!

L = 77
M = 4, sqrt(M) = 2
S = 81, sqrt(S) = 9
- S (81) jest kwadratem!

Liczba znalezionych kwadratów dla 77: 2

Gdzie Suma Pierwiastków całkowitych  2+9 , daje akurat dzielnik liczby 77 czyli 11.

import math

def is_perfect_square(n):
    """Sprawdza, czy liczba jest kwadratem."""
    if n < 0:
        return False
    sqrt_n = math.isqrt(n)
    return sqrt_n * sqrt_n == n

def check_dynamic_subtraction(L):
    """Dynamicznie odejmuje liczby nieparzyste od L i bada S."""
    count = 0  # Licznik znalezionych kwadratów
    i = 1  # Pierwsza liczba nieparzysta
    
    while L - i >= 0:  # Dopóki mamy dodatnie L - i
        new_L = L - i
        M = (new_L // 2) ** 2
        S = M + L  # Wyznaczanie S zgodnie z Twoim pomysłem
        
        if is_perfect_square(S):  # Sprawdzamy tylko S, bo M już jest kwadratem
            sqrt_S = math.isqrt(S)
            sqrt_M = math.isqrt(M)  # Pierwiastek kwadratowy z M
            count += 1
            print(f"L = {L}")
            print(f"M = {M}, sqrt(M) = {sqrt_M}")
            print(f"S = {S}, sqrt(S) = {sqrt_S}")
            print(f"- S ({S}) jest kwadratem!\n")

        i += 2  # Kolejna liczba nieparzysta
        
    print(f"Liczba znalezionych kwadratów dla {L}: {count}\n")

print("#### Test Pierwszeństwa Mart'a (Kwadrat) ####")
# Pytamy użytkownika o liczbę
L = int(input("Podaj liczbę do sprawdzenia: "))
wynik = check_dynamic_subtraction(L)
print("Wynik:", wynik)
komentarz 23 marca 2025 przez CosmoWielki Użytkownik (730 p.)
edycja 24 marca 2025 przez CosmoWielki

@CosmoWielki, 

#### Test Pierwszeństwa Mart'a (Miller-Rabin) ####

 

Bez Losowości

Bez import random

bez random.randint

Już To nawet Autor: wymyślił!!!

Paradoks, nawet nie wiem do końca jak ten test działa,he he.

Wystarczy za (a) podstawić coś względnego,

coś co ma wspólnego z samym (L)

Znalazłem takie Coś!!!(nawet nie jedno!!!)

#### Test Pierwszeństwa Mart'a (Miller-Rabin/SUMA S Podstaw K) ####

import math

def suma_podstaw_kwadratow(L):
    S = 0
    while L > 0:
       x = math.isqrt(L)  # Największa możliwa podstawa kwadratu
       S += x
       L -= x * x  # Odejmujemy jego kwadrat
    return S

def miller_rabin(L, k=5):
    S = suma_podstaw_kwadratow(L)
    if L < 2:
        return False
    if L in (2, 3):
        return True
    if L % 2 == 0:
        return False

    r, d = 0, L - 1
    while d % 2 == 0:
        r += 1
        d //= 2

    for _ in range(k):
        a = S
        x = pow(a, d, L)
        if x in (1, L - 1):
            continue
        for _ in range(r - 1):
            x = pow(x, 2, L)
            if x == L - 1:
                break
        else:
            return False
    return True

print("#### Test Pierwszeństwa Mart'a (Miller-Rabin/SUMA S Podstaw K) ####")

L = int(input("Podaj liczbę początkową do sprawdzenia: "))
N = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))

for i in range(N):
    liczba = L + i
    if miller_rabin(liczba):  # Sprawdzamy, czy liczba jest pierwsza
        print(f"\nLiczba pierwsza znaleziona: {liczba}")

 

Pierwsze (a) równe jest sumie podstaw

max kwadratów danej Liczby L:

(def suma_podstaw_kwadratow(L):

S = 0

while L > 0:

x = math.isqrt(L) # Największa możliwa podstawa kwadratu

S += x

L -= x * x # Odejmujemy jego kwadrat

return S)

a=S

#### Test Pierwszeństwa Mart'a (Miller-Rabin/LOG) ####

import math
import sys

# Zwiększenie limitu dla dużych liczb (np. 50000 cyfr)
sys.set_int_max_str_digits(50000)

def miller_rabin(L, k=1):
    if L < 2:
        return False
    if L in (2, 3):
        return True
    if L % 2 == 0:
        return False

    r, d = 0, L - 1
    while d % 2 == 0:
        r += 1
        d //= 2

    for _ in range(k):
        a = math.floor(math.log(L))
        x = pow(a, d, L)
        if x in (1, L - 1):
            continue
        for _ in range(r - 1):
            x = pow(x, 2, L)
            if x == L - 1:
                break
        else:
            return False
    return True

print("#### Test Pierwszeństwa Mart'a (Miller-Rabin/LOG) ####")

L = int(input("Podaj liczbę początkową do sprawdzenia: "))
N = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))

for i in range(N):
    liczba = L + i
    if miller_rabin(liczba):  # Sprawdzamy, czy liczba jest pierwsza
        print(f"\nLiczba pierwsza znaleziona: {liczba}")

Drugie (a) równe jest:

albo math.floor(math.log(L))

albo math.floor(math.log2(L))

 

Podsatwiamy za (a)

Proste ???

### Test Pierwszeństwa Mart'a

(Miller-Rabin/Zbór Różnic Isqrt###

import math
import sys

# Zwiększenie limitu dla dużych liczb (np. 50000 cyfr)
sys.set_int_max_str_digits(50000)

def miller_rabin(L, k=1):
    N=math.isqrt(L)
    G=math.isqrt(N)
    R=L-(N-G)**2 
    if L < 2:
        return False
    if L in (2, 3):
        return True
    if L % 2 == 0:
        return False

    r, d = 0, L - 1
    while d % 2 == 0:
        r += 1
        d //= 2

    for _ in range(k):
        a = R
        x = pow(a, d, L)
        if x in (1, L - 1):
            continue
        for _ in range(r - 1):
            x = pow(x, 2, L)
            if x == L - 1:
                break
        else:
            return False
    return True

print("#### Test Pierwszeństwa Mart'a (Miller-Rabin/RÓZNICA R) ####")

L = int(input("Podaj liczbę początkową do sprawdzenia: "))
N = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))

for i in range(N):
    liczba = L + i
    if miller_rabin(liczba):  # Sprawdzamy, czy liczba jest pierwsza
        print(f"\nLiczba pierwsza znaleziona: {liczba}")

Trzecie(a) tworzymy z pierwiastka całkowiotego (L)

N = math.isqrt(L)

G = math.isqrt(N)

R = L - (N – G)**2

 

Podsatwiamy za (a)

a=R lub,

a=N-R lub,

a=N-G lub,

a=R-G

Proste ???

SAM TEST M-R

w Pythonie

 

(import math

import random) reszte znacie.

Dlaczego działa?

Nie Wiem!!!

Nie jestem:

ani INFORMATYKIEM

ani MATEMATYKIEM

Wiem, za to, że działa !!!

Mimo,że każdy z tych testów prawidłowo rozróżnia liczby które podstawiam,

np. iloczyn dwóch dużych liczb pierwszych:

Liczba Złożona

140724947908352864484832510718003864268645259830137600282762802664542588002678864993144378536440898997040742809479252996567592914121658976794500363388621033087104455303140505348730039601777259373217414274494067287314024093097815175240623121979139293257796744139125751874874772619047261597116800630119749936938330787354377213095202526485850020299760259205787735760011329272567422841926833414712913633736918913082551827456746747174738629342824122333295664078938181035511556018789343141008505568579595270345677699694095010510131229555107356819733142060956332778455895928747404429047836855767414846659907910500566320720267685864698490246392142749358629831144632738226378546780369139970207441219359677010599674409446943950736778475352105585176586901970413856267038556536222796405754825016250717629009772755244809801076529413526201405439989310500243513089228760587696523745404739289031506684456956255663816436340318688906691548174393245093393313550674896888437100482274701927856475816257599453874153633247215857820463930431951359607849683805768495024238948876349244244743383844305403926874865606769124106962993294625771904773093261432895520120274506934816539019946171519523160793015649098172078119151149367009692864440836002947769640600358978658491614577057695607084295000425027203677321528703923628686501539811642699652671613259458735950157214307049042533497993610665137052342510796107963570198463955537456053958162096080081392165554909558744910214507916285988745275861318552522442748587684539594217816033617703583952570799847604025558010536616126618157646791499373241072059387936732867794716539359593258024371674921447479274596227787696803831983947131970585123496449638656948651762369699566033044125368386526026022972224999083683072700471726941416153059178010466470300497869957759669093308682950459033655795288778944546102627008183757608616087517358878192315238682725041479

Potrzebne dalsze Badania!!!

Po co to komu?

 

Też Nie Wiem, He He

 

Dalsze badania ujawniły błędy pomiędzy Losowym (a) i  (a), nie mniej jednak najbardziej obiecującym okazał się log2, ponieważ nie zależnie od wyboru możliwego zakresu  program wyszukiwał tylko jeden błąd, mianowicie (5), który pozbyłem się dodając do kodu 5:

 if L in (2, 3, 5):
        return True

aby zwiększyć prawdopodobieństwo dodałem również:

N=math.floor(math.log2(L))
G=math.ceil(math.log2(L))

cały zakres zwiększył się o:

# Dynamiczny wybór kilku różnych wartości `a`
    a_values = [N,G, N+G]

import math

def decompose(L):
    """Rozkłada L - 1 na postać 2^r * d"""
    r, d = 0, L - 1
    while d % 2 == 0:
        r += 1
        d //= 2
    return r, d

def miller_rabin(L, k=5):
    """Customowy test Millera-Rabina z dynamicznym doborem podstawy `a`"""
    N=math.floor(math.log2(L))
    G=math.ceil(math.log2(L))
    if L < 2:
        return False
    if L in (2, 3, 5):
        return True
    if L % 2 == 0:
        return False
    
    r, d = decompose(L)

    # Dynamiczny wybór kilku różnych wartości `a`
    a_values = [N,G, N+G]

    for a in a_values:
        x = pow(a, d, L)
        if x in (1, L - 1):
            continue
        for _ in range(r - 1):
            x = pow(x, 2, L)
            if x == L - 1:
                break
        else:
            return False
    return True

print("#### Test Pierwszeństwa Mart'a (Miller-Rabin/F-C/Log2) ####")

L = int(input("Podaj liczbę początkową do sprawdzenia: "))
N = int(input("Podaj ilość kolejnych liczb do sprawdzenia: "))

for i in range(N):
    liczba = L + i
    if miller_rabin(liczba):  # Sprawdzamy, czy liczba jest pierwsza
        print(f"\nLiczba pierwsza znaleziona: {liczba}")

1 odpowiedź

+1 głos
odpowiedź 16 marca 2025 przez jankustosz1 Nałogowiec (37,030 p.)

Przeiteruj się po liczbach od 1 do miliona i sprawdź czy twój algorytm działa tak samo dobrze jak ten Milera-Rabina. Mi się tego nie chce robić.

Następnie spójrz w swój kod i zobacz ze złożoność twojego algorytmu to O(sqrt(n)). W takim czasie można ze 100% pewnością powiedzieć czy liczba jest pierwsza po prostu sprawdzając czy któraś z liczb do pierwiastka dzieli tę liczbę. Wniosek. Twój algorytm jest bezużyteczny. Liczę na najlepszą odpowiedź za zaoszczędzenie twojego czasu i powstrzymanie Cię od dalszego brnięcia w ślepą uliczkę smiley

komentarz 20 marca 2025 przez CosmoWielki Użytkownik (730 p.)

Masz rację ale jeśli coś możemy komplikować , to czemu tego nie zrobić?

#### Test Pierwszeństwa Mart'a (Losowy Kwadrat) ####
Podaj liczbę L: 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Podaj liczbę powtórzeń N: 100
NWD(L, R_d) = 7
NWD(L, W_c) = 3
NWD(L, W_c) = 3
NWD(L, R_d) = 11
NWD(L, W_c) = 11
NWD(L, R_d) = 13
NWD(L, W_c) = 3
NWD(L, R_d) = 7
NWD(L, W_c) = 7
NWD(L, R_d) = 9
NWD(L, W_c) = 33
NWD(L, W_c) = 13
NWD(L, R_d) = 3
NWD(L, R_d) = 429
NWD(L, W_c) = 33
NWD(L, R_d) = 3
NWD(L, W_c) = 9
NWD(L, R_d) = 7
NWD(L, W_c) = 259
NWD(L, R_d) = 7
NWD(L, W_c) = 7
NWD(L, R_d) = 11
NWD(L, R_d) = 3
NWD(L, W_c) = 13
NWD(L, R_d) = 7
NWD(L, W_c) = 351
NWD(L, W_c) = 1221
NWD(L, R_d) = 13
NWD(L, W_c) = 13
NWD(L, R_d) = 33
NWD(L, W_c) = 33
NWD(L, R_d) = 13
NWD(L, W_c) = 3
NWD(L, R_d) = 3367
NWD(L, W_c) = 13
NWD(L, R_d) = 77
NWD(L, W_c) = 2079
NWD(L, R_d) = 9
NWD(L, R_d) = 1221
NWD(L, R_d) = 231
NWD(L, W_c) = 11
NWD(L, R_d) = 11
NWD(L, R_d) = 91
NWD(L, W_c) = 7
NWD(L, R_d) = 21
NWD(L, W_c) = 11
NWD(L, R_d) = 13
NWD(L, W_c) = 21
NWD(L, R_d) = 77
NWD(L, R_d) = 11
NWD(L, W_c) = 111
NWD(L, W_c) = 13
NWD(L, R_d) = 3
NWD(L, W_c) = 9
NWD(L, R_d) = 7
NWD(L, R_d) = 7
NWD(L, W_c) = 297
NWD(L, R_d) = 11
NWD(L, R_d) = 111
NWD(L, W_c) = 11
NWD(L, R_d) = 13
NWD(L, W_c) = 39
NWD(L, R_d) = 143
NWD(L, W_c) = 77
NWD(L, R_d) = 21
NWD(L, R_d) = 77
NWD(L, W_c) = 63
NWD(L, R_d) = 3
NWD(L, R_d) = 11
NWD(L, W_c) = 111
NWD(L, R_d) = 21
NWD(L, W_c) = 7
NWD(L, R_d) = 77
NWD(L, W_c) = 11
NWD(L, R_d) = 33
NWD(L, R_d) = 231
NWD(L, W_c) = 7
NWD(L, R_d) = 7
NWD(L, W_c) = 7
NWD(L, R_d) = 11
NWD(L, R_d) = 21
NWD(L, W_c) = 7
NWD(L, R_d) = 13
NWD(L, R_d) = 111
NWD(L, W_c) = 3
NWD(L, R_d) = 77
NWD(L, W_c) = 17171
NWD(L, W_c) = 21
NWD(L, R_d) = 77
NWD(L, W_c) = 21
NWD(L, R_d) = 39
NWD(L, W_c) = 39
NWD(L, R_d) = 11
NWD(L, W_c) = 13
NWD(L, R_d) = 21
NWD(L, R_d) = 37
NWD(L, R_d) = 11
NWD(L, W_c) = 1443
NWD(L, R_d) = 12987
NWD(L, W_c) = 429
NWD(L, R_d) = 21
NWD(L, W_c) = 273
NWD(L, W_c) = 3
NWD(L, R_d) = 77
NWD(L, R_d) = 13
NWD(L, W_c) = 7
NWD(L, R_d) = 13
NWD(L, W_c) = 13
NWD(L, R_d) = 3367
NWD(L, R_d) = 11
NWD(L, W_c) = 33
NWD(L, R_d) = 7
NWD(L, W_c) = 3
NWD(L, R_d) = 91
NWD(L, W_c) = 11
NWD(L, R_d) = 63
NWD(L, R_d) = 13
NWD(L, W_c) = 13
NWD(L, R_d) = 407
NWD(L, W_c) = 99
NWD(L, R_d) = 3003
NWD(L, W_c) = 3
NWD(L, R_d) = 297
NWD(L, W_c) = 3
NWD(L, R_d) = 3
NWD(L, W_c) = 39
NWD(L, R_d) = 63
NWD(L, W_c) = 7
NWD(L, R_d) = 39
NWD(L, W_c) = 143
NWD(L, R_d) = 819
NWD(L, W_c) = 7
NWD(L, R_d) = 21
NWD(L, R_d) = 13
NWD(L, W_c) = 9
NWD(L, R_d) = 11

import math
import random

def suma_kwadratow_parzystych(L):
    # Calculate the sum of squares of even numbers up to the limit L
    kp = math.isqrt(2 * L)
    # Ensure the random range is valid
    if L - kp >= kp:
        n = random.randint(4, kp - 4)  # Random integer between sqrt(L) and L - sqrt(L)
  
    # Ensure the sum is not greater than L
    while (2 * n * (n + 1) * (2 * n + 1)) // 3 <= L:
        n += L // kp
    
    S_kp = (2 * n * (n + 1) * (2 * n + 1)) // 3  # Sum of squares of even numbers
    R_d = L - S_kp  # Remainder after subtracting sum of even squares
    
    return S_kp, R_d

def sum_of_odd_squares(n):
    # Sum of squares of first n odd numbers (1^2, 3^2, 5^2, ...)
    Skn = n * (2 * n - 1) * (2 * n + 1) // 3  # Formula for the sum of odd squares
    return Skn

def find_negative_remainder(Rd):
    # We start by subtracting sums of odd squares from Rd until we get a negative remainder
    kn = math.isqrt(abs(2 * Rd))
    
    # Ensure the random range is valid
    if Rd - kn > kn:
        n = random.randint(2, kn - 2)
    else:
        n = kn  # If the range is invalid, set n to the lowest possible value
    
    while True:
        Skn = sum_of_odd_squares(n)
        Wc = Rd - Skn
        if Wc < 0:
            return Skn, Wc
        n += Rd // kn

def nwd(a, b):
    # Calculate the greatest common divisor (GCD) using math.gcd
    return math.gcd(a, b)

# Function to repeat N times
def run_multiple_times(L, N):
    has_nwd_greater_than_1 = False  # Flag to track if any NWD > 1 is found

    for _ in range(N):
        # Step 1: Calculate sum of squares of even numbers
        S_kp, R_d = suma_kwadratow_parzystych(L)
        # Step 2: Use the result from Step 1 to find negative remainder with odd squares
        Skn, Wc = find_negative_remainder(R_d)
        # Step 3: Calculate NWD (GCD) of (L, R_d) and (L, W_c)
        nwd_L_Rd = nwd(L, R_d)
        nwd_L_Wc = nwd(L, Wc)
        
        # Display results if NWD > 1
        if nwd_L_Rd > 1:
            print(f"NWD(L, R_d) = {nwd_L_Rd}")
            has_nwd_greater_than_1 = True
        if nwd_L_Wc > 1:
            print(f"NWD(L, W_c) = {nwd_L_Wc}")
            has_nwd_greater_than_1 = True

    # If no NWD > 1 was found, print the message
    if not has_nwd_greater_than_1:
        print(f"L = {L} jest możliwie Pierwszą")

print("#### Test Pierwszeństwa Mart'a (Losowy Kwadrat) ####")
# Przykładowe użycie
L = int(input("Podaj liczbę L: "))
N = int(input("Podaj liczbę powtórzeń N: "))

# Call the function to run N times and print results
run_multiple_times(L, N)

lub zamiast random secrets:

import math
import secrets

def suma_kwadratow_parzystych(L):
    # Calculate the sum of squares of even numbers up to the limit L
    kp = math.isqrt(2 * L)
    # Ensure the random range is valid
    if L - kp >= kp:
        n = secrets.randbelow(kp - 4) + 4  # Random integer between sqrt(L) and L - sqrt(L)
  
    # Ensure the sum is not greater than L
    while (2 * n * (n + 1) * (2 * n + 1)) // 3 <= L:
        n += L // kp
    
    S_kp = (2 * n * (n + 1) * (2 * n + 1)) // 3  # Sum of squares of even numbers
    R_d = L - S_kp  # Remainder after subtracting sum of even squares
    
    return S_kp, R_d

def sum_of_odd_squares(n):
    # Sum of squares of first n odd numbers (1^2, 3^2, 5^2, ...)
    Skn = n * (2 * n - 1) * (2 * n + 1) // 3  # Formula for the sum of odd squares
    return Skn

def find_negative_remainder(Rd):
    # We start by subtracting sums of odd squares from Rd until we get a negative remainder
    kn = math.isqrt(abs(2 * Rd))
    
    # Ensure the random range is valid
    if Rd - kn > kn:
        n = secrets.randbelow(kn - 2) + 2
    else:
        n = kn  # If the range is invalid, set n to the lowest possible value
    
    while True:
        Skn = sum_of_odd_squares(n)
        Wc = Rd - Skn
        if Wc < 0:
            return Skn, Wc
        n += Rd // kn

def nwd(a, b):
    # Calculate the greatest common divisor (GCD) using math.gcd
    return math.gcd(a, b)

# Function to repeat N times
def run_multiple_times(L, N):
    has_nwd_greater_than_1 = False  # Flag to track if any NWD > 1 is found

    for _ in range(N):
        # Step 1: Calculate sum of squares of even numbers
        S_kp, R_d = suma_kwadratow_parzystych(L)
        # Step 2: Use the result from Step 1 to find negative remainder with odd squares
        Skn, Wc = find_negative_remainder(R_d)
        # Step 3: Calculate NWD (GCD) of (L, R_d) and (L, W_c)
        nwd_L_Rd = nwd(L, R_d)
        nwd_L_Wc = nwd(L, Wc)
        
        # Display results if NWD > 1
        if nwd_L_Rd > 1:
            print(f"NWD(L, R_d) = {nwd_L_Rd}")
            has_nwd_greater_than_1 = True
        if nwd_L_Wc > 1:
            print(f"NWD(L, W_c) = {nwd_L_Wc}")
            has_nwd_greater_than_1 = True

    # If no NWD > 1 was found, print the message
    if not has_nwd_greater_than_1:
        print(f"L = {L} jest możliwie Pierwszą")

print("#### Test Pierwszeństwa Mart'a (Losowy Kwadrat) ####")
# Przykładowe użycie
L = int(input("Podaj liczbę L: "))
N = int(input("Podaj liczbę powtórzeń N: "))

# Call the function to run N times and print results
run_multiple_times(L, N)

Mimo,że uliczka jes ślepa, a może jednak nie jest wystarczy,że znajde sposób by każdy iloczyn liczb złożonych złożonych a*b przekształcić w inny iloczyn a*c lub -a*1, 

Myśłałem,że znalazłem ten sposób, wystarczy od liczby Nieparzystej L odjąć najpierw kolejne Kwadraty Liczb Parzystych, aż do reszty dodatniej Rd , następnie od Tej reszty dodatniej odjąć kolejno kwadraty nieparzyste, aż do  pierwszego wyniku ujemnego określiłem ją jako Wc wynik całkowity. Wc przeważnie, albo raczej często jest tym drugim iloczynem a*c lub a*1. po wykorzystaniu wzorów na kp i kn  oraz na sumy kwadratów  parzystych i nieparzystych, obliczamy ten iloczyn nie szukając, ale nawet to co jest proste okazało się skomplikowane.

NIE umiem poprawnie wyznaczyć kn i kp, choć same wzory na sumy działają poprawnie.:

import math

def suma_kwadratow_parzystych(L):
    # Calculate the sum of squares of even numbers up to the limit L
    n = 1
    while (2 * n * (n + 1) * (2 * n + 1)) // 3 <= L:
        n += 1
    n -= 1  # Step back to the last valid value
    
    S_kp = (2 * n * (n + 1) * (2 * n + 1)) // 3
    R_d = L - S_kp
    
    return S_kp, R_d

def sum_of_odd_squares(n):
    # Sum of squares of first n odd numbers (1^2, 3^2, 5^2, ...)
    Skn = n * (2 * n - 1) * (2 * n + 1) // 3
    return Skn

def find_negative_remainder(Rd):
    # We start by subtracting sums of odd squares from Rd until we get a negative remainder
    n = 1
    while True:
        Skn = sum_of_odd_squares(n)
        Wc = Rd - Skn
        if Wc < 0:
            return Skn, Wc
        n += 1

def nwd(a, b):
    # Calculate the greatest common divisor (GCD) using math.gcd
    return math.gcd(a, b)

print("#### Test Pierwszeństwa Mart'a (Suma Kwadratów) ####")
# Przykładowe użycie
L = int(input("Podaj liczbę L: "))

# Step 1: Calculate sum of squares of even numbers
S_kp, R_d = suma_kwadratow_parzystych(L)
print(f"Dla L = {L} suma kwadratów parzystych S_kp = {S_kp}, reszta dodatnia R_d = {R_d}")

# Step 2: Use the result from Step 1 to find negative remainder with odd squares
Skn, Wc = find_negative_remainder(R_d)
print(f"Suma kwadratów nieparzystych S_kn = {Skn}, reszta ujemna W_c = {Wc}")

# Step 3: Calculate NWD (GCD) of (L, R_d) and (L, W_c)
nwd_L_Rd = nwd(L, R_d)
nwd_L_Wc = nwd(L, Wc)

print(f"NWD(L, R_d) = {nwd_L_Rd}")
print(f"NWD(L, W_c) = {nwd_L_Wc}")

Podobne pytania

0 głosów
1 odpowiedź 196 wizyt
0 głosów
0 odpowiedzi 262 wizyt
pytanie zadane 16 lipca 2019 w C# przez DrajzleR Obywatel (1,380 p.)
0 głosów
0 odpowiedzi 189 wizyt

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...