LINUX.ORG.RU

Этот код можно ускорить. Как?

 crypto-class, dlog,


2

2

Заранее прошу прощения за говно, надеюсь услышать как можно больше дельных советов от вас по поводу кода, алгоритма и вообще и все, никаких лиспосрачей мне тут!

Некторые на форуме крипто-класса смогли написать это так, чтобы оно работало за 2 секунды(с+гмп). Я не силен ни в гмп, ни в высокопроизводительном коде на с/с++, поэтому у меня - 23 секунды. Даже умные питонщики делаеют это за 7( А пхпшники зато 10 часов тратят мвахаха.

Алгоритм:

http://storage5.static.itmages.ru/i/12/0429/h_1335728040_9763321_2b2db0c223.png

//Тут было решение, но меня убедили его убрать. Я не знаю, как теперь наполнить этот тред смыслом, может быть, кто-то просто сможет написать код, который работает быстрее 23 секунд? Говнопсевдокод: http://pastebin.com/yP6Um0uR

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 3)

никаких лиспосрачей

C++

«Я три дня преследовала вас, чтобы сказать, как вы мне безразличны».

Гоноркод-то, курсеровый, читал?

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

1. Числа - по 155 цифр, их в тамошний повмод не засунешь. Тут нужна гмп.

2. valgrind показывает, что куча времени уходит на всякие вызовы функций гмп. Короче, я как-то коряво юзаю гмп, видимо, а заодно и плюсы, от этого все проблемы.

За алгоритм спасибо, но я уже решил задание) Мне нужно просто понять, где недочеты, кроме моей днк)

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

Да, я знаю, но раз срок вроде как практически вышел - это раз, до полного дедлайна еще очень далеко - два, а в-третьих, есть вариант запихнуть эту штуку под пароль в виде правильного ответа, но кто тогда будет туда добираться?

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

Оправдание ты себе нашёл конечно убийственное.

Во-первых ты запостил решение, во-вторых ты запостил условие, да еще и вообще не запариваясь на обфускации. По мне так ссаными тряпками тебя с курсера стоит прогнать.

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

Я поправил еще пост. Не знаю, теперь же вообще тред тупаком попахивает. Лучше бы ты помог, конечно, чем дисциплину наводил. Но я исправился.

cdshines ★★★★★
() автор топика

Почему бы на форуме корсеры не спросить? В соседнем nlp всегда активно обсуждаются алгоритмы, помощи найти легко. К тому же недавно запилили новые подфорумы для разговоров (и для решений) по конкретным ПА.

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

Я там спрашивал, но те, кто пишет на си, в тех тредах только раз светятся, хвастаются впечатлящими цифрами и пропадают. Основную массу постов занимают сишарпщки и джависты с их 10-200 секунд и проблемами с BigInteger.

cdshines ★★★★★
() автор топика

в первом цикле
зачем каждый раз вычислять inv ? он же неменяеться ?
pow равен старому pow * inc - и ненадо какждый раз его в степень возводить

ae1234 ★★
()

Ты не смотри, что числа порядка 2**512. Там в подсказке недаром написано про диапазон чисел 0 .. 2**20. Решение валяется именно в этом диапазоне.

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

Я знаю, я его как бы нашел. 375 миллиардов с чем-то там. Оно в диапазоне от 0 до 2**40, а не 2**20. 2**20 - это мое разбиение, чтобы выразить искомое число как х1*2**20+х0, чтобы тратить не О(2**40), а О(2**20) времени. Если бы я не смотрел, я бы две недели считал в лучшем случае))

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

Ага, у меня inv вынесен на самом деле. А вот pow надо покрутить.

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

ох, там, видимо, уже все продумали до нас, и алгоритм возведения в степень по модулю таки лучше, чем умножение, а потом взятие по модулю. Потому что так только растет время. Ну, либо я все-таки еще хуже, чем думал раньше.

cdshines ★★★★★
() автор топика

На SBCL работает 600 секунд на моем C2D. На тривиальных алгоритмах из ironclad, которые деревянные чуть менее чем полностью.

Надо будет запилить нормальную реализацию вычислений в GF. А то стыд и срам ёпт

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

Я говорю, что люди просто брали с/++ и гмп и делали это за 2 секунды. А не пилили свои велосипеды.

cdshines ★★★★★
() автор топика

посмотрел на псведокод... мне кажется в частности твоя проблема в «// using map». если это - std::map, то при большом количестве элементов производительность его деградирует жутким образом.

попробуй например google::dense_hash_map. о результатах доложи :) хэшфункцию возьми из буста. например.

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

Может, unordered map покатит? В этих твоих штуках можно сто лет ковыряться, и все равно говно сделаю.

cdshines ★★★★★
() автор топика

С помощью CL и LispWorks PE. /thread

anonymous
()

В общем, поигравшись... с моей кривой имплементацией выходит 14 секунд. Но есть потенциал для оптимизации, вечерком руки дойдут - попробую. Большой прирост дают, как правильно сказали (ну и как я предполагал своим «фаст экспонент»), более аккуратное возведение в степень - домножением.

invy ★★★★★
()
21 декабря 2012 г.

удалось ли Вам ускорить код свыше 23 секунд?

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

У Вас не осталось кода случайно посмотреть модификации? Мой код по листингу вроде начинает что то делать,но видимо слишком долго расчитывает потому что вылетает с Fatal Error

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

Да, было что-то около 7, но этому треду же скоро год как, у меня и кода уже не осталось. Но там все достаточно просто.

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

Если я тебе дам свой код, сможешь подсказать в чем проблема? У меня аналогичное задание, только не с курсеры, а в универе. Алгоритм описанный на e-maxx только с длинными числами, дает удивительно медленное вычисление. Я описал класс-обертку для работы с mpir, чтобы можно было работать с ними также как с обычными числами. Алгоритма с e-maxx так и не дождался на 20 бит. Даже тупой перебор секунд за 20 справляется. А 40 бит ничего не берет

Chubakur ★★
()
Последнее исправление: Chubakur (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.