Forth
http://fforum.winglion.ru/

"Треугольные" тройки чисел
http://fforum.winglion.ru/viewtopic.php?f=19&t=2397
Страница 3 из 3

Автор:  chess [ Сб янв 23, 2010 10:21 ]
Заголовок сообщения: 

mOleg писал(а):
таким образом считать ничего не надо особо.

Условие задачи вами не понято.
Вот пример: N=6
1 2 3 4 5 6
треугольные тройки:
(234) (245) (256) (345) (346) (356) (456)
Q3=7
Ни в одной тройке нет одинаковых чисел.

Автор:  mOleg [ Сб янв 23, 2010 11:13 ]
Заголовок сообщения: 

<pre>
\ количество троек различных треугольников # с одной фиксированной вершиной u
: nnn ( u --> # )
0 >R
3 - BEGIN DUP 0 > WHILE
DUP R+
2 -
REPEAT DROP R> ;

\ общее количество = сумме ряда кол-во треугольников для u-1 + количество треугольников для u
: xxx ( u --> # )
0 >R
3 BEGIN DDUP - WHILE
DUP nnn R+
1 +
REPEAT DDROP R> ;

\
: triangles ( u --> ) BEGIN DUP xxx . CR 1 - DUP 3 = UNTIL DROP ;

\ поэтому, собственно можно не считать в цикле каждый раз
\ как сделано выше, а использовать накопительную переменную
: tr ( u --> )
3 0 >R BEGIN DDUP - WHILE
DUP nnn R+
R@ . CR
1 +
REPEAT DDROP RDROP ;

</pre>
log:
<pre>
FORTH(0)> 33 triangles
2360
2135
1925
1729
1547
1378
1222
1078
946
825
715
615
525
444
372
308
252
203
161
125
95
70
50
34
22
13
7
3
1
0
</pre>

принцип тот же, что и в решении с неправильно понятым ТЗ.

Автор:  chess [ Сб янв 23, 2010 23:56 ]
Заголовок сообщения: 

можно еще проще:
Код:
: Q3 ( N -- Q )
0 OVER 2/ 1+ 1  DO  OVER I 2* - DUP 1- * 2/ +  LOOP NIP ;

Автор:  chess [ Пн янв 25, 2010 12:57 ]
Заголовок сообщения: 

Чуть изменил код на форте, для переписывания на встроенном асс-ме:

Код:
: Q3 ( N -- Q )
0 OVER 2/ 1 SWAP DO OVER I 2* - DUP 1- * 2/ + -1 +LOOP NIP ;

SEE Q3

\ код на ассме
: Q3a ( N -- Q )
S^S ( сумма ) B=A ( N ) C=A 1C>> ( I )
L1: D=B A=C 1A<< D-A A=D A-- *D 1A>> S+A C-- L1 J0<> A=S ;

SEE Q3a

: pr-fvm  5000 Q3  ;  METER pr-fvm

: pr-trg  5000 Q3a ;  METER pr-trg

лог
Код:
CODE Q3
5AEB13 8945FC           MOV     FC [EBP] , EAX
5AEB16 C745F800000000   MOV     F8 [EBP] , # 0
5AEB1D D1F8             SAR     EAX , 1
5AEB1F C745F401000000   MOV     F4 [EBP] , # 1
5AEB26 BA00000080       MOV     EDX , # 80000000
5AEB2B 2B55F4           SUB     EDX , F4 [EBP]
5AEB2E 8D1C02           LEA     EBX , [EDX] [EAX]
5AEB31 8B45F8           MOV     EAX , F8 [EBP]
5AEB34 8D6DFC           LEA     EBP , FC [EBP]
5AEB37 6877EB5A00       PUSH    , # 5AEB77
5AEB3C 52               PUSH    EDX
5AEB3D 53               PUSH    EBX
5AEB3E 90               XCHG     EAX, EAX
5AEB3F 90               XCHG     EAX, EAX
5AEB40 8945FC           MOV     FC [EBP] , EAX
5AEB43 8B4500           MOV     EAX , 0 [EBP]
5AEB46 8945F8           MOV     F8 [EBP] , EAX
5AEB49 8B0424           MOV     EAX , [ESP]
5AEB4C 2B442404         SUB     EAX , 4 [ESP]
5AEB50 8D044500000000   LEA     EAX , 0 [EAX*2]         
5AEB57 F7D8             NEG     EAX
5AEB59 0345F8           ADD     EAX , F8 [EBP]
5AEB5C 8945F8           MOV     F8 [EBP] , EAX
5AEB5F 8D40FF           LEA     EAX , FF [EAX]
5AEB62 F76DF8           IMUL    F8 [EBP]
5AEB65 D1F8             SAR     EAX , 1
5AEB67 0345FC           ADD     EAX , FC [EBP]
5AEB6A 810424FFFFFFFF   ADD     [ESP] , # FFFFFFFF
5AEB71 71CD             JNO     5AEB40
5AEB73 8D64240C         LEA     ESP , C [ESP]
5AEB77 8D6D04           LEA     EBP , 4 [EBP]
5AEB7A C3               RET     NEAR
END-CODE
( 104 bytes, 32 instructions )

CODE Q3a
5AEB8B 33F6             XOR     ESI , ESI
5AEB8D 8BD8             MOV     EBX , EAX
5AEB8F 8BC8             MOV     ECX , EAX
5AEB91 D1E9             SHR     ECX , 1
5AEB93 8BD3             MOV     EDX , EBX
5AEB95 8BC1             MOV     EAX , ECX
5AEB97 D1E0             SHL     EAX , 1
5AEB99 2BD0             SUB     EDX , EAX
5AEB9B 8BC2             MOV     EAX , EDX
5AEB9D 48               DEC     EAX
5AEB9E F7EA             IMUL    EDX
5AEBA0 D1E8             SHR     EAX , 1
5AEBA2 03F0             ADD     ESI , EAX
5AEBA4 49               DEC     ECX
5AEBA5 75EC             JNE     5AEB93
5AEBA7 8BC6             MOV     EAX , ESI
5AEBA9 C3               RET     NEAR
END-CODE
( 31 bytes, 17 instructions )

26829 26667  ( при Ft=3ГГц  t=8,6 мкс)
14229 14157  ( при Ft=3ГГц  t=4,6 мкс)
Ok


ps.
1. Рациональная организация входных данных может резко упростить алгоритм решения и его кодирование.
( если бы числа нат. ряда были расположены в случайном порядке, то сложность была бы значительно выше ).
Поэтому есть смысл в анализе необходимости этапа подготовки исх. данных.

2. Алгоритм настолько прост, что можно было убрать все аспекты эмуляции
виртуальной машины форта, в том числе и стек данных, то есть
привести код к виду оптимальному для данной целевой машины(вручную конечно).
(нет переписывания кэш-памяти данных и кода по ходу исполнения - приоритет 1,
все вычисления только в регистрах - приоритет 2)
В результате сравнения видно, что ускорение "родного" кода по сравнению с peephole-оптимизированным
кодом спф4 всего-то в два раза. Куски peephole-оптимизированного кода сращиваются друг с другом
через стек данных. Собственно это обстоятельство и приводит к замедлению кода в два раза.

Автор:  garbler [ Пн янв 25, 2010 15:34 ]
Заголовок сообщения: 

WingLion писал(а):
garbler писал(а):
требование одно единственное: А+Б > В

ой ли?
...skip...
Возьмите числа 1,2,100 и попробуйте треугольник с такими длинами построить.
В евклидовом пространстве это явно не получится. А неевклидово пространство - не от этой задачи


разумеется имелась ввиду отсортированная последовательность (т.е. условие автоматически накладывается на все стороны).

и вообще: http://www.research.att.com/~njas/sequences/A002623 - number of nondegenerate triangles that can be made from rods of length 1,2,3,4,...,n ..... и куча других формулировок. все формулы в конце.

тема закрыта?

Автор:  forther [ Пн янв 25, 2010 23:05 ]
Заголовок сообщения: 

да, закрыта. спасибо за ссылку! для тех, кто поленился посмотреть в конец:

Код:
: q3 ( n -- q ) 3 - dup 2 + over 2* 3 + over 2 + * * 24 / ;


оптимизация ...

Автор:  Hishnik [ Пн янв 25, 2010 23:35 ]
Заголовок сообщения: 

Да еще проще.

Код:
: q3 ( n -- q ) CELLS solution-table[] + @ ;

Автор:  forther [ Пн янв 25, 2010 23:52 ]
Заголовок сообщения: 

без определения solution-table[] это не решение. незачот.

Автор:  forther [ Вт янв 26, 2010 00:30 ]
Заголовок сообщения: 

Кстати, chess, при N=5000 результат 34 битный, так что ваши сравнения на таких N могут не совсем корректно сравнивать. Если, конечно, у вас не 64 битный форт. Имеет смысл считать двойной результат:
Код:
: q3 ( n -- d ) 3 - dup 2 + over 2* 3 + over 2 + m* rot 24 m*/ ;

Автор:  chess [ Вт янв 26, 2010 13:14 ]
Заголовок сообщения: 

forther писал(а):
да, закрыта. спасибо за ссылку! для тех, кто поленился посмотреть в конец:

Код:
: q3 ( n -- q ) 3 - dup 2 + over 2* 3 + over 2 + * * 24 / ;

Ага,
сделано уже (с)

У вас ошибка, правильно так:
Код:
: q3 ( n -- q )
4 - DUP 2 + SWAP 2* 3 + OVER 2 + * * 24 / ;

можно проще
Код:
: Q3
DUP 2- DUP 2* 1- * * 24 /  ;

forther писал(а):
Имеет смысл считать двойной результат:
Код:
: q3 ( n -- d ) 3 - dup 2 + over 2* 3 + over 2 + m* rot 24 m*/ ;


В СПФ нет функции UD/ ( ud un --> ud ), определим на ассме:

Код:
: UD/ ( ud un --> ud )
D^D S=A A=@P $ 4 Pa /S
B=A A=@P /S
@P=A A=B ;

: QQ3 ( n -- dq )
DUP 2- DUP 2* 1- * M* 24 UD/  ;   20000 QQ3  D.


ЛОГ
Код:
666516675000
Ok

Страница 3 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/