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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.