Jikka-5.6.0.0: A transpiler from Python to C++ for competitive programming
Copyright(c) Kimiyuki Onaka 2021
LicenseApache License 2.0
Maintainerkimiyuki95@gmail.com
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Jikka.Core.Convert.SortAbs

Description

\[ \newcommand\int{\mathbf{int}} \newcommand\bool{\mathbf{bool}} \newcommand\list{\mathbf{list}} \]

Synopsis

Documentation

run :: (MonadAlpha m, MonadError Error m) => Program -> m Program Source #

run reduces \(\lvert \sum _ {a_i \in a} \sum _ {a_j \in a} f(a, a_i, a_j) \rvert\) to \(\mathbf{let}~ b = \mathrm{sort}(a) ~\mathbf{in}~ \sum \sum f'(a, a_i, a_j)\) when \(f\) contains \(\lvert a_i - a_j \rvert\) and \(f(a, a_i, a_j) = f(a, a_j, a_i)\) holds.

Example

Before:

sum (map (fun (a_i: int) ->
    sum (map (fun (a_j: int) ->
        abs (a_i - a_j)
    ) a)
) a)

After:

let b = sort a
in sum (map (fun (i: int) ->
    (sum (map (fun (b_j: int) ->
        b_i - b_j
    ) b[:i])
    + 0
    + sum (map (fun (b_j: int) ->
        b_j - b_i
    ) b[i + 1:]))
) (range (length b)))

internal rules