Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/103: Рейтинг темы: голосов - 103, средняя оценка - 4.63
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317

Разложение на множители

19.08.2020, 09:43. Показов 19919. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача разложения числа на простые(!) множители решается многими методами и довольно быстро.
Существует ли встроенная функция или метод для волучения всех(!) вариантов получения числа произведением других натуральных чисел.
Для себя сделал, но, например, для числа 720 время нахождения всех вариантов занимает ~ 0,3 сек
Хотелось бы быстрее
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2020, 09:43
Ответы с готовыми решениями:

Разложение на множители
Добрый день. Нужно разложить число на множители в виде: 24=2*2*2*2*3. Но в программе получается результат: 24=2*2*2*3. Не знаю, откуда...

Разложение на простые множители
Требуется разложить целое число N на простые множители и вывести результат в порядке возрастания множителей с указанием степени. ...

Разложение на простые множители
Разложение на простые множители Требуется разложить целое число N на простые множители с учётом их степени и вывести результат в порядке...

31
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 11:13
Что ускорять будем?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 12:32  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def delit(a) :
    res = []
    i = 1
    while i * i < a + 1 :
        if a % i == 0 :
            temp = [i, a // i]
            res.append(temp)
        i += 1
    return res 
    
n = int(input())
npr = [2,3,5,7,11,13,17,19,23,29]
 
# первичное разложение на парные делители
fact = delit(n)
 
flen = len(fact)
while True :
    for j in range(flen) :
        zero = 1
 
        # если в очередном списке делителей 
        #есть "1", пропустить
        if 1 not in fact[j] :
            zero = 0
            n1 = list(fact[j])
 
            # "вытаскиваем" последний делитель из списка
            # и ищем все попарные разложения на множители
            factj = delit(n1.pop())
 
            # каждую полученную пару 
            #объединяем со списком
            for k in range(len(factj)) :
                factj[k].extend(n1)
                factj[k].sort()
                fact.append(factj[k])
    flen = len(fact)
 
    # если zero не изменилось во всех списках,
    # все варианты найдены
    if zero == 1:
        break
 
# удаляем 1 из всех вариантов
for ik in fact :
    ik.sort(reverse=True)
    if ik[-1] == 1 :
        ik.pop()
 
# удаляем одинаковые списки
j =[0]
resj = []
for i in fact :
    if i != j :
        resj.append(i)
    j=i
 
######################################
Добавлено через 3 минуты
Основные "прожорливые" - 34-36 строки

Добавлено через 14 минут
Нашел одну "ошибку": после 51-й строчки нужно
Python
1
fact.sort()
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 12:42
Чота я вообще не понял, что у вас в большом цикле while.
Но по функции delit могу посоветовать - а зачем там перебираются все потенциальные делители, через +1? Перебирайте только простые. Простые должны быть закешированы.

Добавлено через 6 минут
Псевдокод, как это должно быть:

Code
1
2
3
4
5
6
7
8
9
список_простых_чисел. в нём курсор = 0.
список_делителей = []
остаток := число. 
 
пока остаток > 1:
    получить простой_делитель.
        пока остаток делится на простой_делитель:
            остаток := остаток // простой_делитель
            список_делителей.append(простой_делитель)
Как-то так. У вас что-то сложное.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
19.08.2020, 12:48
Какая задача?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 12:52  [ТС]
Вся задача звучит так:
Для заданного числа N найти наименьшее число, имеющего ровно N делителей

Добавлено через 28 секунд
Выложенный код - часть решения

Добавлено через 1 минуту
Само решение основано на:
Количество делителей числа равно произведению степеней плюс 1 всех его простых множителей

Добавлено через 1 минуту
Число 24
Состоит из 2^3 * 3^1
Значит 24 имеет = (3+1)*(1+1) = 8 множителей
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 12:56
Gdez, простых или любых?
В любом случае, разложением на простые делители тут как-то не очень пахнет.

Добавлено через 2 минуты
Цитата Сообщение от Gdez Посмотреть сообщение
Значит 24 имеет = (3+1)*(1+1) = 8 множителей
Откуда тут +1?
24=2*2*2*3. Откуда тут 8?

Добавлено через 48 секунд
Цитата Сообщение от Gdez Посмотреть сообщение
Вся задача звучит так:
Для заданного числа N найти наименьшее число, имеющего ровно N делителей
Если речь о простых множителях, то наименьшее будет 2^N. Ничего раскладывать не надо.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 12:59  [ТС]
В задаче N < 1000
Значит количество простых множителей <= 10
Отсюда в коде есть
Python
1
npr = [2,3,5,7,11,13,17,19,23,29]
Полученные списки "resj", перебирая, возвожу соответствующие элементы списка "npr" и перемножаю их
Ответ - искомое число

Добавлено через 1 минуту
Нет.
4 делителя у 6 - это 1,2,3,6
А 2^4 = 16 > 6
В понятие делитель входят все числа от 1 до самого числа
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 12:59
Gdez, если простых множителей, то 2^N. Если различных простых множителей, то [p1*...*pN], где p1...pN - простые числа по порядку, нанчиная с 2. В любом случае, раскладывать не надо.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 13:01  [ТС]
У 24 делители 1,2,3,4,6,8,12,24
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 13:01
Gdez, а, то есть всех делителей, включая составные, не повторяющиеся, включая 1 и само число.
Для 24 это 1, 2, 3, 4, 6, 12, 24. То есть 7. Я ничего не напутал?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 13:02  [ТС]
Еще 8-ка
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 13:02
А, забыл 8. Понятно.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 13:04  [ТС]
Былы идея - N разложить на простые множители и найти все варианты перемножения, при которых резултатом будет N
С помощью itertools. Но запутался)))
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 13:05
Уже не так очевидно, но, пмм, тут надо идти конструктивным путём, то есть составить число. Перебор сдохнет.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 13:10  [ТС]
В "идеальном" решении время 60 мсек
У меня 372

Добавлено через 3 минуты
Перебором уже на N=16 больше 2 сек
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
19.08.2020, 13:23
Может быть так?..
Оценить возможную длину массива A[] - например последующим экспериментальным прогоном в цикле от 0 до 1000.

Элемент массива A[i] - это количество делителей числа i.
Потом во вложенных циклах заполнил бы массив A[]
Code
1
2
3
4
for i in range(1,N)
    for j in range(0,N)
        A[i*j] += 1   - тут можно иначе организовать цикл, чтобы было сложение, вместо умножения
        if A[i*j]==N: printf(i*j)
Понятно, что N делителей будет у числа, превосходящего N в несколько раз.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.08.2020, 13:30
Составляем примерно так.
Для N=2, решение 2, список [1,2].
К этому списку можно добавить следующее наименьшее число, 3. Но тогда к нему автоматически добавится и 6. И получим решение для N=4. Таким образом заполним некоторые числа для массива ответов.
Для незаполненых (3) будем искать как лучшее из предыдущиих с добавлением чего-то. И тоже будем "попадать" не в те клетки. Но постепенно все заполним.
То есть, для ответа для N=3 у нас есть знание про [1,2] для N=2. По очереди добаволяем к списку : 3 - уже было, 4 - о, подходит. И так далее.

Добавлено через 2 минуты
Разложение на простые множители тут и правда может выскочить, для проверки после очередного добавления.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from functools import reduce
from operator import mul
npr = [2,3,5,7,11,13,17,19,23,29]
 
 
def prime_factors(n):
    primes_iter = iter(npr)
    remainder = n
    result = []
 
    while remainder > 1:
        factor = next(primes_iter)
        while remainder % factor == 0:
            result.append(factor)
            remainder //= factor
 
    # lets check:
    assert reduce(mul, result) == n
    return result
 
 
print(prime_factors(720))
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.08.2020, 14:07  [ТС]
N = 720
Ответ = 61261200
61261200 = 2^4 * 3^2 * 5^2 * 7^1 * 11^1 * 13^1 * 17^1
Проверка - (4+1)*(2+1)*(2+1)*(1+1)*(1+1)*(1+1)*(1+1 )
5 * 3 * 3 * 2 * 2 * 2 * 2 = 720

Добавлено через 7 минут
Например для N = 32 наилучшим будет = 4*2*2*2
Степени - 3, 1, 1, 1
2^3*3*5*7 = 840
Здесь "4" - непростой множитель

Добавлено через 3 минуты
ФедосеевПавел,
Вылетает по времени
Ну и множителей может быть от одного до десяти
Цикл по двум, трем, четырем ..... ?
Долго

Добавлено через 3 минуты
Есть идругие, например, 24
Для него -4*3*2
И решение - 360
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
19.08.2020, 15:47
Т.е. нужно решить уравнение

Пусть наше искомое число X раскладывается на простые множители
https://www.cyberforum.ru/cgi-bin/latex.cgi?X=2^{b_0}\cdot 3^{b_1}\cdot 5^{b_2}...
Согласно формуле из
https://ru.wikihow.com/найти-к... лого-числа
число X имеет ровно N делителей, причём
https://www.cyberforum.ru/cgi-bin/latex.cgi?N=(b_0+1)\cdot (b_1+1)\cdot (b_2+1)\cdot ...

И теперь встаёт задача разложить N на множители (в количестве от 1 до максимума), чтобы X было минимально.

Похоже, что нужно максимально длинное разложение N.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2020, 15:47
Помогаю со студенческими работами здесь

Разложение на простые множители
Разложение на простые Требуется разложить целое число N на простые множители с учётом их степени и вывести результат в порядке...

Разложение на простые множители (Время: 1 сек. Память: 16 Мб Сложность: 27%)
Требуется вывести представление целого числа N в виде произведения простых чисел. Входные данные Входной файл INPUT.TXT содержит...

Разложение на множители
Факторизацией называется разложение произвольного натурального числа n в произведение целых положительных чисел, больших 1. Два разложения...

Разложение на простые множители (сириус)
Не могу решить казалось бы простую задачу, помогите пожалуйста с решением. (знаю что такая тема была на форуме, но от туда ничего не...

Разложение на множители
Любое число может быть единственным образом разложено на простые сомножители. Написать программу для выполнения такого разложения.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru