LINUX.ORG.RU

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

 


0

2

Как для целого числа n перчислить все его возможные разложения на множители?

Мне приходит в голову такой алгоритм: разложить n на простые множители, затем перечислять все подмножества этого множества. Но так как в множестве 2^k подмножеств, это работает невыносимо долго, к тому же, многие разложения перечисляются многократно.

Как правильно?

Deleted

Школу прогуливал?

J ★★★★★
()

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

вас это беспокоит, хотите поговорить об этом? :)

Harald ★★★★★
()

вроде у Шнайера в прикладной криптографии описывается алгоритм. Если погуглить, тоже что-нибудь найдется

Harald ★★★★★
()

Берёшь квантовый компьютер и раскладываешь за ~logN.

Artificial_Thought ★★★★
()
Ответ на: комментарий от redgremlin

Разложение числа на множители отличается от разложения на простые множители тем, что оно не единственно.

Deleted
()
Ответ на: комментарий от Deleted

По ссылке сходить, конечно, слабо?

Факториза́цией натурального числа называется его разложение в произведение простых множителей

redgremlin ★★★★★
()

for (int i = 0; i < sqrt(N); ++i)

Дальше сам думай.

Dragon59 ★★
()

Наверное, всё же придётся делать разбиение множества алгоритмом бэктрекинга. Плохо то, что алгоритм экспоненциальный, значит медленный.

Deleted
()
Ответ на: комментарий от anonymous

Меряемся писюками, у кого быстрее :-)

$ time factor 9999999999999997111
9999999999999997111: 9999999999999997111

real    0m4.994s
user    0m4.972s
sys     0m0.004s

anonymous
()
Ответ на: комментарий от TheKnight

Это сарказм? У меня плохо с детектором, так что на всякий случай выше по треду ссылка на википедию, выбирай любой.

Dragon59 ★★
()
Ответ на: комментарий от anonymous
$ time factor 9999999999999997111
9999999999999997111: 9999999999999997111

real	0m0.002s
user	0m0.000s
sys	0m0.002s
$ factor --version               
factor (GNU coreutils) 8.20
Packaged by Gentoo (8.20-r2 (p1.4))
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, Torbjorn Granlund, and Niels Moller.
quasimoto ★★★★
()
Ответ на: комментарий от TheKnight

Поиск привёл как всегда к книге Кнута. Глава 7.2.1 «Разбиение мультимножеств».

Deleted
()
Ответ на: комментарий от quasimoto

С таблицей значений? К слову в дебиане:

time factor 9999999999999997111
9999999999999997111: 9999999999999997111

real    0m6.517s
user    0m6.464s
sys     0m0.036s
factor (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin.

anonymous
()
Ответ на: комментарий от NorokKrin

Говно мамонта у тебя вместо мозгов (и у меня вместо ос). Ты бы версии сравнил для начала — где-то в 2011-2012 factor-ng.c смержили в factor.c, делай выводы.

anonymous
()
Ответ на: комментарий от anonymous

С таблицей значений?

Эвристики разные, скорее всего (make-prime-list.c -> primes.h тоже). Например

$ time factor      123456789123456789123456789123456789123456789123456789  
123456789123456789123456789123456789123456789123456789: 3 3 3 7 11 13 19 757 3607 3803 52579 70541929 14175966169 440334654777631
factor 123456789123456789123456789123456789123456789123456789  0,04s user 0,00s system 97% cpu 0,044 total
$ timeout 5 factor 123456789123456789123456789123456789123456789123456
quasimoto ★★★★
()
Ответ на: комментарий от anonymous

Меряемся писюками, у кого быстрее :-)

~$ time factor 9999999999999997111
9999999999999997111: 9999999999999997111

real	0m0.001s
user	0m0.000s
sys	0m0.000s
~$ factor --version
factor (GNU coreutils) 8.20
Copyright (C) 2012 Free Software Foundation, Inc.
wota ★★
()
Последнее исправление: wota (всего исправлений: 1)

есть как бы основная теорема арифметики ( о единственности представления числа в виде произведения степеней простых делителей)

F=a**Z*b**Y*c**X*....

где a,b,c, ряд(весь) простых чисел Z,Y,X,.. - в какой степени (т.е максимальное число сколько раз можно последовательно делить начиная с исходного без остатка) этот простой делитель делит данное число F - очевидно что большинство показателей будет нули ( и обычно их(соот простые числа) просто не выписывают))

обрати внимания что такая запись(не нулевые показатели) похожа на позиционую запись.

можеш понять что всякие делители(включая 1 и само число) исходного числа в такой форме имеет на каждой позиции число в диапазоне от нуля до максимальной для даного числа.

т.е общее число делителей(с учётом 1 и самого числа) есть произведение степеней( увеличеных на 1) рекурсивно можно красиво перечислять все делители .

qulinxao ★★☆
()
Ответ на: комментарий от Kakadu

Я думаю, что надо адаптировать алгоритм тот разбиения на слагаемые.

не подойдет, автор же явно написал:

для целого числа n перечислить все его возможные разложения на множители?

нужно адаптировать алгоритм разбиения на все возможные слагаемые

anonymous
()
Ответ на: комментарий от qulinxao

итить, когда уже в этой теме дойдут до таблицы умножения?

yyk ★★★★★
()

вот тебе пример, а долго это или нет - сам решай:

Sat Feb 16 20:49:04 2013  factoring 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139 (100 digits)
Sun Feb 17 06:37:54 2013  prp50 factor: 37975227936943673922808872755445627854565536638199
Sun Feb 17 06:37:54 2013  prp50 factor: 40094690950920881030683735292761468389214899724061
Sun Feb 17 06:37:54 2013  elapsed time 09:48:50
yyk ★★★★★
()
Ответ на: комментарий от yyk

а вот повторно с учётом уже сохранённого «решета»:

Sun Feb 17 10:07:02 2013  factoring 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139 (100 digits)
Sun Feb 17 10:07:45 2013  prp50 factor: 37975227936943673922808872755445627854565536638199
Sun Feb 17 10:07:45 2013  prp50 factor: 40094690950920881030683735292761468389214899724061
Sun Feb 17 10:07:45 2013  elapsed time 00:00:43

yyk ★★★★★
()
Ответ на: комментарий от yyk

ТС не каноническое разложение нужно, а мультипликативные композиции, например

12 = {{2, 2, 3}, {2, 3, 2}, {2, 6}, {3, 2, 2}, {3, 4}, {4, 3}, {6, 2}, {12}}

или без учёта порядка

12 = {{3, 2, 2}, {4, 3}, {6, 2}, {12}}

т.е. мультипликативные разбиения, по аналогии с аддитивными разбиениями (которые чаще встречаются). Про то как считать - http://www.math.wvu.edu/~mays/Papers/Factorizations.pdf, ещё на SO был вопрос - http://stackoverflow.com/q/8558292/1337941 - если каноническое разложение уже есть, то всё сводится к построению всех разбиений множества, можно нагуглить разные алгоритмы, в том числе у Кнута.

Иначе говоря, в данном кольце для данного элемента x может быть множество наборов элементов произведение которых = x, вне зависимости от канонического разложения, которое, конечно, одно (в UFD). Вот такое множество наборов для данного x \in N \sub Z нужно найти.

quasimoto ★★★★
()

Делаете функцию, в ней цикл i от 2 до sqrt(n), в нем рекурсивный вызов этой функции для (n % i) (под % я понимаю целочисленное деление), если нет остатка

alix ★★★★
()
Ответ на: комментарий от Deleted

Ну да, потом надо уникальные выделить

alix ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.