J: 분할
J: 분할 (Intro 14)
J 입문 14장에서는 부분합을 계산하기 위해 인자의 각 접두사(prefix)·접미사(suffix)·대각선에 함수를 적용하는 분할(partition) 부사 \, \., / (oblique)를 설명해요.
출처: 문서
본문
함수 sum=: +/은 전체 목록 인자에 적용돼요. 부분합(subtotals)을 계산하려면 그것을 인자의 각 접두사에 적용해야 해요. 예를 들어:
sum=: +/
a=: 1 2 3 4 5 6
(sum a) ; (sum\ a)
+--+--------------+
|21|1 3 6 10 15 21|
+--+--------------+
기호 \은 접두사 부사(prefix adverb)를 나타내며, 그 인자(이 경우 sum)를 최종 인자의 각 접두사에 적용해요. 부사 \.은 접미사(suffix)에 비슷하게 적용돼요:
sum\. a
21 20 18 15 11 6
단항 <은 단순히 인자를 박스(box)하고, 따라서 동사 <\과 <\.은 분할의 효과를 매우 선명하게 보여줘요. 예를 들어:
<1 2 3
+-----+
|1 2 3|
+-----+
(<1),(<1 2),(<1 2 3)
+-+---+-----+
|1|1 2|1 2 3|
+-+---+-----+
<\ a
+-+---+-----+-------+---------+-----------+
|1|1 2|1 2 3|1 2 3 4|1 2 3 4 5|1 2 3 4 5 6|
+-+---+-----+-------+---------+-----------+
<\. a
+-----------+---------+-------+-----+---+-+
|1 2 3 4 5 6|2 3 4 5 6|3 4 5 6|4 5 6|5 6|6|
+-----------+---------+-------+-----+---+-+
사선 부사(oblique adverb) /은 표를 대각선을 따라 분할해요. 따라서:
</. t=: 1 2 1 */ 1 3 3 1
+-+---+-----+-----+---+-+
|1|3 2|3 6 1|1 6 3|2 3|1|
+-+---+-----+-----+---+-+
t ; (sum/. t) ; (10 #. sum/. t) ; (121*1331)
+-------+-------------+------+------+
|1 3 3 1|1 5 10 10 5 1|161051|161051|
|2 6 6 2| | | |
|1 3 3 1| | | |
+-------+-------------+------+------+
연습문제 (Exercises)
14.1
점진적 곱(progressive products), 점진적 최댓값, 점진적 최솟값을 위한 sum=:+/\에 유사한 프로그램을 정의해 보세요.
14.2
다음 프로그램들과 주석을 12절의 것들처럼, 즉 읽고 쓰기의 연습으로 다루세요. c=:1 3 3 1, d=:1 2 1, x=:i.5로 c pol x, c pp d, (c pp d) pol x 같은 표현을 실험해 보세요. 계급(rank)의 사용에 대해서는 사전 또는 20절을 참조하세요:
| J | 의미 |
|---|---|
pol=: +/@([*]^i.@#@[)"1 0 |
다항식(Polynomial) |
pp=: +//.@(*/) |
다항식 곱(Polynomial product) |
pp11=: 1 1&pp |
1 1에 의한 다항식 곱 |
pp11 d |
|
pp11^:5 (1) |
|
ps=: +/@,: |
다항식 합(Polynomial sum) |