Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
9 / 9 / 8
Регистрация: 03.07.2015
Сообщений: 219
1

Оптимизация программы(Гипотеза Коллатца)

14.12.2015, 19:03. Показов 1979. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
(https://ru.wikipedia.org/Гипотеза_Коллатца)
Суть гипотезы загключается в следующем: берём целое число, если оно чётное делим его на 2, если не четное, то умножаем на 3 и добавляем единицу и так до того момента пока, число не будет равняться 1, вопрос гипотезы таков, любое ли число исходя из предыдущего алогоритма дойдет до 1.

Приведу пример для n=3;
3=3,10,5,16,8,4,2,1. Т.е. мы сделали 7 шагов до 1, а в последовательности имеем 8 чисел(именно кол-во чисел программа и считает, если это количество больше 255, тогда заканчиваем вичисления).
C
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
#include<stdio.h>
 
int collatza(int n){
        int cnt=0;
        asm volatile(
        ".intel_syntax noprefix;"
        "mov eax,%1;"
        "mov ebx,0;"
"start:"
        "cmp ebx,255;"
        "je FIN;"
 
        "cmp eax,1;"
        "je isOne;"
 
        "test eax,1;"
        "jnz nieP;"
        "jz takP;"
 
"nieP:"
        "mov ecx,eax;"
        "add eax,eax;"
        "add eax,ecx;"
        "add eax,1;"
        "add ebx,1;"
        "add ebx,1;"
        "shr eax;"
        "jmp start;"
 
"takP:"
        "shr eax;"
        "add ebx,1;"
        "jmp start;"
 
 
        "isOne:"
        "add ebx,1;"
        "FIN:"
        "mov %0,ebx;"
 
 
        ".att_syntax prefix;"
        :"=r"(cnt)
        :"r"(n)
        :"eax","ebx","ecx"
        );
return cnt;
}
int main(){
unsigned char wynik[65536];
int i;
        for(i=0;i<65536;++i){
                wynik[i]=collatza(i+1);
        }
return 0;
}
Напишу псевдокод алгоритма, который написан на ассемблере:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
start:
if(counter==255)goto FIN;
if(n==1)goto isOne;
if(n%2==1)goto nieP
else goto takP
 
nieP:
int e = n;
n=n+n;
n=(n+e)/2;
counter = counter + 2;
goto start;
 
takP:
n=n/2;
counter++;
goto start;
 
isOne;
counter++;
FIN:
Мои скромные знания ассемблер позволили данный код оптимитизировать до такой степени, в которой Вы его видите сейчас. Вопрос таков, подскажите советом или идеей, как ещё возможно оптимизировать данный код на ассемблер, чтобы программа заработала быстрее????

Добавлено через 8 минут
Вот такая вот идея, а что если перейти на нижние регистры, т.е. например вместо eax везде написать al итд?????
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2015, 19:03
Ответы с готовыми решениями:

Гипотеза Коллатца и 2*n-1
Гипотеза Коллатца Collatz conjecture почему в гипотезе используется 3*n+1 если тот же результат...

Гипотеза Коллатца
Берём любое натуральное число n. Если оно чётное, то делим его на 2, а если нечётное, то умножаем...

Гипотеза Коллатца(ускорить код)
Существует вот такая вот гипотеза Коллатца(https://ru.wikipedia.org/wiki/Гипотеза_Коллатца),...

Одна из нерешенных проблем математики — гипотеза Коллатца
Одна из нерешенных проблем математики — гипотеза Коллатца — касается последовательности чисел...

1
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 169
Записей в блоге: 1
16.12.2015, 12:48 2
Лучший ответ Сообщение было отмечено Aliaxandr как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
        mov     ecx,255
  @start:
        dec     ecx
        jz      @finish
        shr     eax,1
        jz      @finish
        jnc     @start
        lea     eax,[2*eax+eax+2]
        dec     ecx
        jnz     @start
  @finish:
        mov     eax,ecx
        not     al
Начальное число в EAX, ответ в AL.
По моим тестам вышло вроде как на 30 процентов быстрее. Но у вас там ошибка: в 25-26 строка увеличивается EBX, но не проверяется, чему он стал равен. Поэтому нормально сравнить по скорости не получилось.
1
16.12.2015, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2015, 12:48
Помогаю со студенческими работами здесь

Последовательность Коллатца
Всем добрый день! Задачка у меня - найти самую длинную цепочку чисел до миллиона по правилу:...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Оптимизация программы
Ув. обыватели, Вчера написал &quot;Калькулятор&quot;, но так как я ещё зеленый в программировании на С++,...

Оптимизация программы
Нужно, чтобы программа случайным образом придумывала число от 1 до 32767 и печатала его цифры через...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru