Здравствуйте, Кодт, Вы писали:
К>Если размер кода или глубина стека разбухает кратно увеличению разрядности, то указатель инструкции или стека, соответственно, — это скрытая переменная.
Не понял. Эти указатели и так есть, при любой реализации.
К>Не понял, как считать по твоей формуле. Вот так получилось 5 переменных. К>
К>// n*n = n*2^k + n*(n-2^k)
К>int square(int n)
К>{
К> int s = 0;
К> int m = n; // правый множитель
К> while(m > 0)
К> {
К> int p = 1; // 2^k, k=0, 1, ...
К> int pn = n; // p*n
К> while(p+p <= m)
К> {
К> p += p;
К> pn += pn;
К> }
К> s += pn;
К> m -= p;
К> }
К> return s;
К>}
К>
Да, я это понял. Но если развернуть портянку ифов, перебрав все случаи двоичного порядка для m, то будет 4. А по схеме от n-2*k к n можно свести и до 3.
ПС еле нашёл тему, фиг тут поймёшь что куда переносится
Re[10]: Занятная задачка на возведение в квадрат
От:
Аноним
Дата:
09.07.14 09:30
Оценка:
TB>ПС еле нашёл тему, фиг тут поймёшь что куда переносится
Ага, я подумал, что рекрутеры пожаловались, и тему удалили
Здравствуйте, TarasB, Вы писали:
К>>Если размер кода или глубина стека разбухает кратно увеличению разрядности, то указатель инструкции или стека, соответственно, — это скрытая переменная. TB>Не понял. Эти указатели и так есть, при любой реализации.
вот смотри
int square(int n) {
int m = n; // множительint s = 0; // сумматор
assert(n < 32);
if(m >= 16) {
int t = n; t+=t; t+=t; t+=t;
s += t;
m -= 16;
}
if(m >= 8) {
int t = n; t+=t; t+=t;
s += t;
m -= 8;
}
if(m >= 4) {
int t = n; t+=t; t+=t;
s += t;
m -= 4;
}
if(m >= 2) {
int t = n; t+=t;
s += t;
m -= 2;
}
if(m >= 1) {
int t = n;
s += t;
m -= 1;
}
}
С каждым новым битом у нас добавляется новый шаблонный кусок кода. То есть, мы сделали за компилятора такую работу
RUN <16> ();
RUN <8> ();
RUN <4> ();
RUN <2> ();
RUN <1> ();
и вот этот параметр — 1..16 — спрятали, синхронизировав с указателем инструкции.
А вот если бы у нас был цикл, то такая синхронизация отсутствовала бы. И стало бы очевидно, нужна ли ещё одна переменная, или можно обойтись, построив цикл над уже существующими.
TB>ПС еле нашёл тему, фиг тут поймёшь что куда переносится
Здравствуйте, Кодт, Вы писали:
К>С каждым новым битом у нас добавляется новый шаблонный кусок кода. То есть, мы сделали за компилятора такую работу К>и вот этот параметр — 1..16 — спрятали, синхронизировав с указателем инструкции.
Ну спрятали, да. Ну и? Это параметр времени компиляции, а не выполнения.
Может ещё посчитать переменные, которые были у меня в голове, когда я придумывал этот код?
Здравствуйте, TarasB, Вы писали:
TB>Ну спрятали, да. Ну и? Это параметр времени компиляции, а не выполнения. TB>Может ещё посчитать переменные, которые были у меня в голове, когда я придумывал этот код?
TB>Я просто смысла уже не понимаю, сформулируй ясно, что именно мы считаем.
Смысл такой: если масштабирование задачи ведёт к перекомпиляции, — то значит, параметры времени компиляции тоже надо учитывать.
Иначе, в пределе, можно вообще одной переменной обойтись
Здравствуйте, Кодт, Вы писали:
К>Смысл такой: если масштабирование задачи ведёт к перекомпиляции, — то значит, параметры времени компиляции тоже надо учитывать.
Заточка кода под новую разрядность всегда ведёт к перекомпиляции.
К>Иначе, в пределе, можно вообще одной переменной обойтись К>Тоже за логарифмическое время. По-твоему, это честно?
Да, можно. Насчёт честности — условия надо уточнять. Что мы минимизируем? Число занятых регистров? Объём исполняемого кода? Скорость исполнения? Или всё вместе с какими-то весами? А скорость на чём мерять, что это за экзотический процессор, не умеющий умножать?
К>Так я и говорю: www.rsdn.ru, дерево слева, в самом низу "Мой RSDN", ветка "ответы мне" или "мои сообщения"