Вопрос: Как найти наибольший общий делитель (НОД) двух целых чисел?

 

НАИБОЛЬШИЙ ОБЩИЙ ДЕЛИТЕЛЬ (НОД). Решение задач. Видеоурок | МАТЕМАТИКА 6 класс

Видео взято с канала: МАТЕМАТИКА online


 

Наибольший общий делитель

Видео взято с канала: Valery Volkov


 

НАИБОЛЬШИЙ ОБЩИЙ ДЕЛИТЕЛЬ чисел НОД математика

Видео взято с канала: физика ОГЭ математика ЕГЭ Романов Владимир


 

Практикум Pascal. Урок 7: Задача № 12. Наибольший общий делитель

Видео взято с канала: TheMrDen3D


 

Найдите наибольший общий делитель / НОД(2^40–1, 2^30–1)=?

Видео взято с канала: Valery Volkov


 

20 Цикл while Алгоритм Евклида Python

Видео взято с канала: egoroff_channel


 

Как найти наибольший общий делитель (НОД). Взаимно простые числа. Математика 6 класс. Урок #4

Видео взято с канала: Видеоуроки математики


12 комментариев

  • Есть другой алгоритм на основе остатков: с=ав+q, q>0. НОД(c%в; в), а>в, % находит остаток от деления, т.е. находит q. 2^40-1=(2^30-1)*2^10+q. (2^10+1)*(2^30-1) уже больше чем 2^40-1, поэтому и взяли 2^10. Отсюда q=2^10-1. НОД(2^10-1; 2^30-1); НОД[(2^30-1)%(2^10-1); 2^10-1]; НОД[0; 2^10-1] -> 0 на что угодно делится, т.е. наш ответ 2^10-1.

  • Эпическая игра.
    import math

    a,b,n = map(int,input().split())

    khodov=0

    while n>0:

    n=n-math.gcd(a,n)

    a,b = b,a

    khodov=khodov+1

    if khodov%2=0:

    print(1)

    else:

    print(0)

    В примечании к задаче нам намекают на использование матовского gcd(x,y). Так получается менее громоздкий код.

  • Теорема (алгоритм Евклида). ∀a,b >0: a>b → НОД(a, b)=НОД(a-b, b)


    1) ∀k ∈ ℕ: a ⋮ k, b ⋮ k:⇔ ∃n,m ∈ ℤ: a/k = n, b/k=m ⇒ (a/k – b/k) = (a-b)/k = n-m, (n-m) ∈ ℤ ⇒ [ (a-b)/k = n-m, (n-m) ∈ ℤ:⇔ (a-b) ⋮ k ] и b ⋮ k ⇒ (a-b) ⋮ k, b ⋮ k.

    Итого: ∀k ∈ ℕ: a ⋮ k, b ⋮ k ⇒ (a-b) ⋮ k, b ⋮ k (1)

    2) ∀k ∈ ℕ: (a-b) ⋮ k, b ⋮ k:⇔ ∃n,m ∈ ℤ: (a-b)/k = n, b/k = m ⇒

    a/k – b/k = n, b/k = m ⇒ a/k – m = n ⇒ a/k = n+m, n+m ∈ ℤ ⇒

    [ a/k = n+m, (n+m) ∈ ℤ:⇔ a ⋮ k ] и b ⋮ k ⇒ a ⋮ k, b ⋮ k

    Итого: ∀k ∈ ℕ: (a-b) ⋮ k, b ⋮ k ⇒ a ⋮ k, b ⋮ k (2)

    (1) и (2) ⇒ ( ∀k ∈ ℕ → a ⋮ k, b ⋮ k ⇔ (a-b) ⋮ k, b ⋮ k ) (*)

    a > b и b > 0 ⇒ (a-b > 0) и (b > 0) ⇒ ∃k1=НОД(a-b, b)

    3) Пусть k = НОД(a, b) ≠ k1 = НОД(a-b, b) ⇒ k > k1 либо k3.a) k > k1

    (*) ⇒ (a-b) ⋮ k, b ⋮ k

    (a-b) ⋮ k, b ⋮ k и k13.b) k < k1
    (*) ⇒ a ⋮ k1, b ⋮ k1

    a ⋮ k1, b ⋮ k1 и k(3.a) и (3.b) ⇒ ( (3) = false ) ⇒ НОД(a, b) = НОД(a-b, b)



    Кажется ничего не упустил.

  • 1)
    2^40 1 = 1 + 2 +… + 2^39 = А
    2^30 1 = 1 + 2 +… + 2^29 = B
    А= B + 2^30 +… + 2^39
    поэтому A= B + 2^30. (2^10 -1)
    2)
    2 н е может делить А (1= 1+2(1+ 2^38)), ни 2^2, ни 2^3, и.т.д.
    2 н е может делить B, ни 2^2, ни 2^3, и.т.д.
    3) общий делитель делит 2^30. (2^10 -1) и он не равно 2, 2^2, и.т.д.
    4) НОД делит (2^10 -1) = 1023 = 3.11.31
    поэтому НОД = 3, 11, 31, 3.11, 3.31,11.31 или 1023.
    5)
    A = 1023.(1+2^10+2^20+2^30)
    B = 1023.(1+2^10+2^20)
    6) НОД = 1023

  • Решил немного по-другому. Сначала заметил, что оба числа делятся на 2^10-1 (как разность кубов и разность чисел 4-ой степени), разделил их, и доказал что получившеися числа являются взаимно простыми числами.

  • Нашел задачу в разделе практика под названием ‘1.А.Эпическая Игра’, накатал индусский код, уверенности в ее правильности нет. Но все же поделюсь решением. Если у кого-нить есть решения, с радостью готов глянуть.
    Для наглядности изменил вывод ответов для понимания

    a1=a=int(input()) цикле переменная меняет значения, использовал a=a1(b=b1, n=n1)для возврата исх. значения.
    b1=b=int(input())
    n1=n=int(input())
    while n1>=0:

    while n>0:
    a,n=n,a%n
    if n1-a<0:
    print(‘Выиграл АНТИСЕМЕН’)
    break
    n1=n1-a
    n=n1
    a=a1

    while n>0:
    b,n=n,b%n
    if n1-b<0:
    print(‘Выиграл СЕМЕН’)
    break
    n1=n1-b
    n=n1
    b=b1

  • b=int(input())

    a=int(input())

    while b!=a:

    if b%a=0:

    break

    if a%b=0:

    break

    if a>b:

    a=a-b

    if b>a:

    b=b-a

    if b%a=0:

    print(‘Наибольший общий делитель’,a)

    if a%b=0:

    print(‘Наибольший общий делитель’,b)

    else:

    print(‘Наибольший общий делитель’,b)

    вот это называется усложнил код

  • Получается что для степеней простого числа A (в данном случае A=2) НОД(A^n-1, A^m-1) = A^НОД(n, m)-1. Разность степеней приводит к тому что за скобку будет выноситься А^m, а в скобках будет оставаться (A^(n-m) 1), в результате чего имеем тот же алгоритм Евклида для показателей степеней. Для примера: НОД(2^50-1, 2^35-1) = 2^НОД(50, 35)-1, или 2^5-1.

  • ввел a,b = map(int,input().split())

    while a!=b:

    if a>b:

    a=a-b

    else:

    b=b-a

    print(«По Евклиду»)

    print(a)
    а получил при вооде это
    7

    Traceback (most recent call last):

    File «C:\python\uroki\evklid_while.py«, line 12, in

    a,b = map(int,input().split())

    ValueError: not enough values to unpack (expected 2, got 1)

  • Приносим свои извинения. При решении четвертой задачи была допущена ошибка на 10 мин 46 сек. Вместо слов «45 делится на 5, например, 15 делится на 5» следует понимать «45 делится на 5, будет 9, делится на 3». Как следствие, на 11 мин 21 сек вместо строки «360 = 2 * 2 * 2 *3 *5 *5» следует понимать «»360 = 2 * 2 * 2 *5 *3 *3».