         dupd divisor? [ [ 2 + ] dip ] when
     ] each drop * ;
 
+<PRIVATE
+
+: transform ( triple matrix -- new-triple )
+    [ 1array ] dip m. first ;
+
+PRIVATE>
+
 ! These transforms are for generating primitive Pythagorean triples
 : u-transform ( triple -- new-triple )
     { { 1 2 2 } { -2 -1 -2 } { 2 2 3 } } transform ;

: perfect-square? ( n -- ? )
    dup sqrt mod zero? ;

<PRIVATE

: count-digits ( n -- byte-array )
    10 <byte-array> [
        '[ 10 /mod _ [ 1 + ] change-nth dup 0 > ] loop drop
    ] keep ;

HINTS: count-digits fixnum ;

: max-children ( seq -- seq )
    [ dup length 1 - <iota> [ nth-pair max , ] with each ] { } make ;

! Propagate one row into the upper one
: propagate ( bottom top -- newtop )
    [ over rest rot first2 max rot + ] map nip ;

: (sum-divisors) ( n -- sum )
    dup sqrt >integer [1,b] [
        [ 2dup divisor? [ 2dup / + , ] [ drop ] if ] each
        dup perfect-square? [ sqrt >fixnum neg , ] [ drop ] if
    ] { } make sum ;

: transform ( triple matrix -- new-triple )
    [ 1array ] dip m. first ;

PRIVATE>

: alpha-value ( str -- n )
    >lower [ CHAR: a - 1 + ] map-sum ;

: mediant ( a/c b/d -- (a+b)/(c+d) )
    2>fraction [ + ] 2bi@ / ;

: max-path ( triangle -- n )
    dup length 1 > [

! Copyright (c) 2007-2010 Aaron Schaefer.
! The contents of this file are licensed under the Simplified BSD License
! A copy of the license is available at http://factorcode.org/license.txt
USING: accessors arrays byte-arrays fry hints kernel lists make
math math.functions math.matrices math.order math.parser
math.primes.factors math.primes.lists math.ranges math.ratios
math.vectors parser prettyprint sequences sorting strings
unicode vocabs.parser words ;
IN: project-euler.common

! A collection of words used by more than one Project Euler solution
