Livt packages

Livt.Signal

Version 0.1.1

Q1.15 sample streams, filters, windows, rate conversion, FFTs, oscillators, and mixers for Livt.

Published files (80)

src/transform/SequentialFftQ15Primitive.vhd

-- Generated by tools/generate_fft_primitive.py. Do not edit manually.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.livt_lang_icontext_package.all;
use work.livt_lang_package.all;

entity livt_signal_transform_sequentialfftq15primitive is
    port (
        ctor_lvt_context_in : in t_icontext_in;
        ctor_sampleshape : in std_logic_vector;
        ctor_stageshape : in std_logic_vector;
        ctor_stageshiftmask : in signed(31 downto 0);
        ctor_inverse : in boolean;
        ctor_inputbitreversed : in boolean;
        ctor_outputbitreversed : in boolean;
        ctor_inputvalid : in boolean;
        ctor_inputready : out boolean;
        ctor_inputreal : in std_logic_vector(15 downto 0);
        ctor_inputimag : in std_logic_vector(15 downto 0);
        ctor_inputfirst : in boolean;
        ctor_inputlast : in boolean;
        ctor_outputvalid : out boolean;
        ctor_outputready : in boolean;
        ctor_outputreal : out std_logic_vector(15 downto 0);
        ctor_outputimag : out std_logic_vector(15 downto 0);
        ctor_outputfirst : out boolean;
        ctor_outputlast : out boolean;
        ctor_framelengtherror : out boolean
    );
end;

architecture rtl of livt_signal_transform_sequentialfftq15primitive is
    constant SAMPLES : positive := ctor_sampleshape'length;
    constant STAGES : positive := ctor_stageshape'length;
    constant MASTER_SAMPLES : positive := 4096;

    subtype complex_word_t is std_logic_vector(31 downto 0);
    subtype q15_t is signed(15 downto 0);
    subtype product_t is signed(31 downto 0);
    subtype complex_product_t is signed(32 downto 0);
    subtype butterfly_t is signed(33 downto 0);
    type sample_memory_t is array (0 to SAMPLES - 1) of complex_word_t;
    type phase_t is (load_frame, compute_read, compute_write,
        emit_read, emit_hold);

    function supported_size(value : positive) return boolean is
    begin
        return value = 8 or value = 16 or value = 32 or value = 64 or
            value = 128 or value = 256 or value = 512 or value = 1024 or
            value = 2048 or value = 4096;
    end;

    function reverse_bits(value : natural; width : positive) return natural is
        variable remaining : natural := value;
        variable result : natural := 0;
    begin
        for bit_index in 0 to width - 1 loop
            result := result * 2 + remaining mod 2;
            remaining := remaining / 2;
        end loop;
        return result;
    end;

    function pack_complex(real_part, imag_part : q15_t)
        return complex_word_t is
    begin
        return std_logic_vector(real_part) & std_logic_vector(imag_part);
    end;

    function quantize_q15(value : butterfly_t; stage_shift : natural)
        return q15_t is
        constant TOTAL_SHIFT : natural := 15 + stage_shift;
        variable extended : signed(34 downto 0);
        variable magnitude, rounded : unsigned(34 downto 0);
        variable sticky : boolean := false;
        variable raw : integer;
    begin
        extended := resize(value, extended'length);
        if extended(extended'high) = '1' then
            magnitude := unsigned(-extended);
        else
            magnitude := unsigned(extended);
        end if;

        rounded := shift_right(magnitude, TOTAL_SHIFT);
        if magnitude(TOTAL_SHIFT - 1) = '1' then
            for bit_index in 0 to TOTAL_SHIFT - 2 loop
                if magnitude(bit_index) = '1' then sticky := true; end if;
            end loop;
            if sticky or rounded(0) = '1' then rounded := rounded + 1; end if;
        end if;

        if extended(extended'high) = '1' then
            if rounded >= resize(to_unsigned(32768, 16), rounded'length) then
                return to_signed(-32768, 16);
            end if;
            raw := to_integer(rounded(15 downto 0));
            return to_signed(-raw, 16);
        end if;
        if rounded > resize(to_unsigned(32767, 15), rounded'length) then
            return to_signed(32767, 16);
        end if;
        return signed(rounded(15 downto 0));
    end;

    function twiddle(master_index : natural; inverse : boolean)
        return complex_word_t is
        variable real_part, imag_part : integer;
    begin
        case master_index is
            when 0 => real_part := 32767; imag_part := 0;
            when 1 => real_part := 32767; imag_part := -50;
            when 2 => real_part := 32767; imag_part := -101;
            when 3 => real_part := 32767; imag_part := -151;
            when 4 => real_part := 32767; imag_part := -201;
            when 5 => real_part := 32767; imag_part := -251;
            when 6 => real_part := 32767; imag_part := -302;
            when 7 => real_part := 32766; imag_part := -352;
            when 8 => real_part := 32766; imag_part := -402;
            when 9 => real_part := 32765; imag_part := -452;
            when 10 => real_part := 32764; imag_part := -503;
            when 11 => real_part := 32763; imag_part := -553;
            when 12 => real_part := 32762; imag_part := -603;
            when 13 => real_part := 32761; imag_part := -653;
            when 14 => real_part := 32760; imag_part := -704;
            when 15 => real_part := 32759; imag_part := -754;
            when 16 => real_part := 32758; imag_part := -804;
            when 17 => real_part := 32757; imag_part := -854;
            when 18 => real_part := 32756; imag_part := -905;
            when 19 => real_part := 32754; imag_part := -955;
            when 20 => real_part := 32753; imag_part := -1005;
            when 21 => real_part := 32751; imag_part := -1055;
            when 22 => real_part := 32749; imag_part := -1106;
            when 23 => real_part := 32748; imag_part := -1156;
            when 24 => real_part := 32746; imag_part := -1206;
            when 25 => real_part := 32744; imag_part := -1256;
            when 26 => real_part := 32742; imag_part := -1307;
            when 27 => real_part := 32740; imag_part := -1357;
            when 28 => real_part := 32738; imag_part := -1407;
            when 29 => real_part := 32736; imag_part := -1457;
            when 30 => real_part := 32733; imag_part := -1507;
            when 31 => real_part := 32731; imag_part := -1558;
            when 32 => real_part := 32729; imag_part := -1608;
            when 33 => real_part := 32726; imag_part := -1658;
            when 34 => real_part := 32723; imag_part := -1708;
            when 35 => real_part := 32721; imag_part := -1758;
            when 36 => real_part := 32718; imag_part := -1809;
            when 37 => real_part := 32715; imag_part := -1859;
            when 38 => real_part := 32712; imag_part := -1909;
            when 39 => real_part := 32709; imag_part := -1959;
            when 40 => real_part := 32706; imag_part := -2009;
            when 41 => real_part := 32703; imag_part := -2060;
            when 42 => real_part := 32700; imag_part := -2110;
            when 43 => real_part := 32697; imag_part := -2160;
            when 44 => real_part := 32693; imag_part := -2210;
            when 45 => real_part := 32690; imag_part := -2260;
            when 46 => real_part := 32686; imag_part := -2310;
            when 47 => real_part := 32683; imag_part := -2360;
            when 48 => real_part := 32679; imag_part := -2411;
            when 49 => real_part := 32675; imag_part := -2461;
            when 50 => real_part := 32672; imag_part := -2511;
            when 51 => real_part := 32668; imag_part := -2561;
            when 52 => real_part := 32664; imag_part := -2611;
            when 53 => real_part := 32660; imag_part := -2661;
            when 54 => real_part := 32656; imag_part := -2711;
            when 55 => real_part := 32651; imag_part := -2761;
            when 56 => real_part := 32647; imag_part := -2811;
            when 57 => real_part := 32643; imag_part := -2861;
            when 58 => real_part := 32638; imag_part := -2912;
            when 59 => real_part := 32634; imag_part := -2962;
            when 60 => real_part := 32629; imag_part := -3012;
            when 61 => real_part := 32625; imag_part := -3062;
            when 62 => real_part := 32620; imag_part := -3112;
            when 63 => real_part := 32615; imag_part := -3162;
            when 64 => real_part := 32610; imag_part := -3212;
            when 65 => real_part := 32605; imag_part := -3262;
            when 66 => real_part := 32600; imag_part := -3312;
            when 67 => real_part := 32595; imag_part := -3362;
            when 68 => real_part := 32590; imag_part := -3412;
            when 69 => real_part := 32585; imag_part := -3462;
            when 70 => real_part := 32579; imag_part := -3512;
            when 71 => real_part := 32574; imag_part := -3562;
            when 72 => real_part := 32568; imag_part := -3612;
            when 73 => real_part := 32563; imag_part := -3662;
            when 74 => real_part := 32557; imag_part := -3712;
            when 75 => real_part := 32551; imag_part := -3762;
            when 76 => real_part := 32546; imag_part := -3812;
            when 77 => real_part := 32540; imag_part := -3861;
            when 78 => real_part := 32534; imag_part := -3911;
            when 79 => real_part := 32528; imag_part := -3961;
            when 80 => real_part := 32522; imag_part := -4011;
            when 81 => real_part := 32515; imag_part := -4061;
            when 82 => real_part := 32509; imag_part := -4111;
            when 83 => real_part := 32503; imag_part := -4161;
            when 84 => real_part := 32496; imag_part := -4211;
            when 85 => real_part := 32490; imag_part := -4260;
            when 86 => real_part := 32483; imag_part := -4310;
            when 87 => real_part := 32477; imag_part := -4360;
            when 88 => real_part := 32470; imag_part := -4410;
            when 89 => real_part := 32463; imag_part := -4460;
            when 90 => real_part := 32456; imag_part := -4510;
            when 91 => real_part := 32449; imag_part := -4559;
            when 92 => real_part := 32442; imag_part := -4609;
            when 93 => real_part := 32435; imag_part := -4659;
            when 94 => real_part := 32428; imag_part := -4709;
            when 95 => real_part := 32421; imag_part := -4758;
            when 96 => real_part := 32413; imag_part := -4808;
            when 97 => real_part := 32406; imag_part := -4858;
            when 98 => real_part := 32398; imag_part := -4907;
            when 99 => real_part := 32391; imag_part := -4957;
            when 100 => real_part := 32383; imag_part := -5007;
            when 101 => real_part := 32376; imag_part := -5057;
            when 102 => real_part := 32368; imag_part := -5106;
            when 103 => real_part := 32360; imag_part := -5156;
            when 104 => real_part := 32352; imag_part := -5205;
            when 105 => real_part := 32344; imag_part := -5255;
            when 106 => real_part := 32336; imag_part := -5305;
            when 107 => real_part := 32328; imag_part := -5354;
            when 108 => real_part := 32319; imag_part := -5404;
            when 109 => real_part := 32311; imag_part := -5453;
            when 110 => real_part := 32303; imag_part := -5503;
            when 111 => real_part := 32294; imag_part := -5553;
            when 112 => real_part := 32286; imag_part := -5602;
            when 113 => real_part := 32277; imag_part := -5652;
            when 114 => real_part := 32268; imag_part := -5701;
            when 115 => real_part := 32259; imag_part := -5751;
            when 116 => real_part := 32251; imag_part := -5800;
            when 117 => real_part := 32242; imag_part := -5850;
            when 118 => real_part := 32233; imag_part := -5899;
            when 119 => real_part := 32224; imag_part := -5948;
            when 120 => real_part := 32214; imag_part := -5998;
            when 121 => real_part := 32205; imag_part := -6047;
            when 122 => real_part := 32196; imag_part := -6097;
            when 123 => real_part := 32186; imag_part := -6146;
            when 124 => real_part := 32177; imag_part := -6195;
            when 125 => real_part := 32167; imag_part := -6245;
            when 126 => real_part := 32158; imag_part := -6294;
            when 127 => real_part := 32148; imag_part := -6343;
            when 128 => real_part := 32138; imag_part := -6393;
            when 129 => real_part := 32129; imag_part := -6442;
            when 130 => real_part := 32119; imag_part := -6491;
            when 131 => real_part := 32109; imag_part := -6541;
            when 132 => real_part := 32099; imag_part := -6590;
            when 133 => real_part := 32088; imag_part := -6639;
            when 134 => real_part := 32078; imag_part := -6688;
            when 135 => real_part := 32068; imag_part := -6737;
            when 136 => real_part := 32058; imag_part := -6787;
            when 137 => real_part := 32047; imag_part := -6836;
            when 138 => real_part := 32037; imag_part := -6885;
            when 139 => real_part := 32026; imag_part := -6934;
            when 140 => real_part := 32015; imag_part := -6983;
            when 141 => real_part := 32005; imag_part := -7032;
            when 142 => real_part := 31994; imag_part := -7081;
            when 143 => real_part := 31983; imag_part := -7130;
            when 144 => real_part := 31972; imag_part := -7180;
            when 145 => real_part := 31961; imag_part := -7229;
            when 146 => real_part := 31950; imag_part := -7278;
            when 147 => real_part := 31938; imag_part := -7327;
            when 148 => real_part := 31927; imag_part := -7376;
            when 149 => real_part := 31916; imag_part := -7425;
            when 150 => real_part := 31904; imag_part := -7473;
            when 151 => real_part := 31893; imag_part := -7522;
            when 152 => real_part := 31881; imag_part := -7571;
            when 153 => real_part := 31870; imag_part := -7620;
            when 154 => real_part := 31858; imag_part := -7669;
            when 155 => real_part := 31846; imag_part := -7718;
            when 156 => real_part := 31834; imag_part := -7767;
            when 157 => real_part := 31822; imag_part := -7816;
            when 158 => real_part := 31810; imag_part := -7864;
            when 159 => real_part := 31798; imag_part := -7913;
            when 160 => real_part := 31786; imag_part := -7962;
            when 161 => real_part := 31774; imag_part := -8011;
            when 162 => real_part := 31761; imag_part := -8059;
            when 163 => real_part := 31749; imag_part := -8108;
            when 164 => real_part := 31737; imag_part := -8157;
            when 165 => real_part := 31724; imag_part := -8206;
            when 166 => real_part := 31711; imag_part := -8254;
            when 167 => real_part := 31699; imag_part := -8303;
            when 168 => real_part := 31686; imag_part := -8351;
            when 169 => real_part := 31673; imag_part := -8400;
            when 170 => real_part := 31660; imag_part := -8449;
            when 171 => real_part := 31647; imag_part := -8497;
            when 172 => real_part := 31634; imag_part := -8546;
            when 173 => real_part := 31621; imag_part := -8594;
            when 174 => real_part := 31608; imag_part := -8643;
            when 175 => real_part := 31594; imag_part := -8691;
            when 176 => real_part := 31581; imag_part := -8740;
            when 177 => real_part := 31568; imag_part := -8788;
            when 178 => real_part := 31554; imag_part := -8836;
            when 179 => real_part := 31540; imag_part := -8885;
            when 180 => real_part := 31527; imag_part := -8933;
            when 181 => real_part := 31513; imag_part := -8982;
            when 182 => real_part := 31499; imag_part := -9030;
            when 183 => real_part := 31485; imag_part := -9078;
            when 184 => real_part := 31471; imag_part := -9127;
            when 185 => real_part := 31457; imag_part := -9175;
            when 186 => real_part := 31443; imag_part := -9223;
            when 187 => real_part := 31429; imag_part := -9271;
            when 188 => real_part := 31415; imag_part := -9319;
            when 189 => real_part := 31400; imag_part := -9368;
            when 190 => real_part := 31386; imag_part := -9416;
            when 191 => real_part := 31372; imag_part := -9464;
            when 192 => real_part := 31357; imag_part := -9512;
            when 193 => real_part := 31342; imag_part := -9560;
            when 194 => real_part := 31328; imag_part := -9608;
            when 195 => real_part := 31313; imag_part := -9656;
            when 196 => real_part := 31298; imag_part := -9704;
            when 197 => real_part := 31283; imag_part := -9752;
            when 198 => real_part := 31268; imag_part := -9800;
            when 199 => real_part := 31253; imag_part := -9848;
            when 200 => real_part := 31238; imag_part := -9896;
            when 201 => real_part := 31223; imag_part := -9944;
            when 202 => real_part := 31207; imag_part := -9992;
            when 203 => real_part := 31192; imag_part := -10040;
            when 204 => real_part := 31177; imag_part := -10088;
            when 205 => real_part := 31161; imag_part := -10135;
            when 206 => real_part := 31146; imag_part := -10183;
            when 207 => real_part := 31130; imag_part := -10231;
            when 208 => real_part := 31114; imag_part := -10279;
            when 209 => real_part := 31098; imag_part := -10326;
            when 210 => real_part := 31082; imag_part := -10374;
            when 211 => real_part := 31067; imag_part := -10422;
            when 212 => real_part := 31050; imag_part := -10469;
            when 213 => real_part := 31034; imag_part := -10517;
            when 214 => real_part := 31018; imag_part := -10565;
            when 215 => real_part := 31002; imag_part := -10612;
            when 216 => real_part := 30986; imag_part := -10660;
            when 217 => real_part := 30969; imag_part := -10707;
            when 218 => real_part := 30953; imag_part := -10755;
            when 219 => real_part := 30936; imag_part := -10802;
            when 220 => real_part := 30920; imag_part := -10850;
            when 221 => real_part := 30903; imag_part := -10897;
            when 222 => real_part := 30886; imag_part := -10945;
            when 223 => real_part := 30869; imag_part := -10992;
            when 224 => real_part := 30853; imag_part := -11039;
            when 225 => real_part := 30836; imag_part := -11087;
            when 226 => real_part := 30819; imag_part := -11134;
            when 227 => real_part := 30801; imag_part := -11181;
            when 228 => real_part := 30784; imag_part := -11228;
            when 229 => real_part := 30767; imag_part := -11276;
            when 230 => real_part := 30750; imag_part := -11323;
            when 231 => real_part := 30732; imag_part := -11370;
            when 232 => real_part := 30715; imag_part := -11417;
            when 233 => real_part := 30697; imag_part := -11464;
            when 234 => real_part := 30680; imag_part := -11511;
            when 235 => real_part := 30662; imag_part := -11558;
            when 236 => real_part := 30644; imag_part := -11605;
            when 237 => real_part := 30626; imag_part := -11652;
            when 238 => real_part := 30608; imag_part := -11699;
            when 239 => real_part := 30590; imag_part := -11746;
            when 240 => real_part := 30572; imag_part := -11793;
            when 241 => real_part := 30554; imag_part := -11840;
            when 242 => real_part := 30536; imag_part := -11887;
            when 243 => real_part := 30518; imag_part := -11934;
            when 244 => real_part := 30499; imag_part := -11980;
            when 245 => real_part := 30481; imag_part := -12027;
            when 246 => real_part := 30462; imag_part := -12074;
            when 247 => real_part := 30444; imag_part := -12121;
            when 248 => real_part := 30425; imag_part := -12167;
            when 249 => real_part := 30407; imag_part := -12214;
            when 250 => real_part := 30388; imag_part := -12261;
            when 251 => real_part := 30369; imag_part := -12307;
            when 252 => real_part := 30350; imag_part := -12354;
            when 253 => real_part := 30331; imag_part := -12400;
            when 254 => real_part := 30312; imag_part := -12447;
            when 255 => real_part := 30293; imag_part := -12493;
            when 256 => real_part := 30274; imag_part := -12540;
            when 257 => real_part := 30254; imag_part := -12586;
            when 258 => real_part := 30235; imag_part := -12633;
            when 259 => real_part := 30216; imag_part := -12679;
            when 260 => real_part := 30196; imag_part := -12725;
            when 261 => real_part := 30177; imag_part := -12772;
            when 262 => real_part := 30157; imag_part := -12818;
            when 263 => real_part := 30137; imag_part := -12864;
            when 264 => real_part := 30118; imag_part := -12910;
            when 265 => real_part := 30098; imag_part := -12957;
            when 266 => real_part := 30078; imag_part := -13003;
            when 267 => real_part := 30058; imag_part := -13049;
            when 268 => real_part := 30038; imag_part := -13095;
            when 269 => real_part := 30018; imag_part := -13141;
            when 270 => real_part := 29997; imag_part := -13187;
            when 271 => real_part := 29977; imag_part := -13233;
            when 272 => real_part := 29957; imag_part := -13279;
            when 273 => real_part := 29936; imag_part := -13325;
            when 274 => real_part := 29916; imag_part := -13371;
            when 275 => real_part := 29895; imag_part := -13417;
            when 276 => real_part := 29875; imag_part := -13463;
            when 277 => real_part := 29854; imag_part := -13508;
            when 278 => real_part := 29833; imag_part := -13554;
            when 279 => real_part := 29813; imag_part := -13600;
            when 280 => real_part := 29792; imag_part := -13646;
            when 281 => real_part := 29771; imag_part := -13691;
            when 282 => real_part := 29750; imag_part := -13737;
            when 283 => real_part := 29729; imag_part := -13783;
            when 284 => real_part := 29707; imag_part := -13828;
            when 285 => real_part := 29686; imag_part := -13874;
            when 286 => real_part := 29665; imag_part := -13919;
            when 287 => real_part := 29643; imag_part := -13965;
            when 288 => real_part := 29622; imag_part := -14010;
            when 289 => real_part := 29600; imag_part := -14056;
            when 290 => real_part := 29579; imag_part := -14101;
            when 291 => real_part := 29557; imag_part := -14146;
            when 292 => real_part := 29535; imag_part := -14192;
            when 293 => real_part := 29514; imag_part := -14237;
            when 294 => real_part := 29492; imag_part := -14282;
            when 295 => real_part := 29470; imag_part := -14327;
            when 296 => real_part := 29448; imag_part := -14373;
            when 297 => real_part := 29426; imag_part := -14418;
            when 298 => real_part := 29404; imag_part := -14463;
            when 299 => real_part := 29381; imag_part := -14508;
            when 300 => real_part := 29359; imag_part := -14553;
            when 301 => real_part := 29337; imag_part := -14598;
            when 302 => real_part := 29314; imag_part := -14643;
            when 303 => real_part := 29292; imag_part := -14688;
            when 304 => real_part := 29269; imag_part := -14733;
            when 305 => real_part := 29247; imag_part := -14778;
            when 306 => real_part := 29224; imag_part := -14823;
            when 307 => real_part := 29201; imag_part := -14867;
            when 308 => real_part := 29178; imag_part := -14912;
            when 309 => real_part := 29155; imag_part := -14957;
            when 310 => real_part := 29132; imag_part := -15002;
            when 311 => real_part := 29109; imag_part := -15046;
            when 312 => real_part := 29086; imag_part := -15091;
            when 313 => real_part := 29063; imag_part := -15136;
            when 314 => real_part := 29040; imag_part := -15180;
            when 315 => real_part := 29016; imag_part := -15225;
            when 316 => real_part := 28993; imag_part := -15269;
            when 317 => real_part := 28970; imag_part := -15314;
            when 318 => real_part := 28946; imag_part := -15358;
            when 319 => real_part := 28922; imag_part := -15402;
            when 320 => real_part := 28899; imag_part := -15447;
            when 321 => real_part := 28875; imag_part := -15491;
            when 322 => real_part := 28851; imag_part := -15535;
            when 323 => real_part := 28827; imag_part := -15580;
            when 324 => real_part := 28803; imag_part := -15624;
            when 325 => real_part := 28779; imag_part := -15668;
            when 326 => real_part := 28755; imag_part := -15712;
            when 327 => real_part := 28731; imag_part := -15756;
            when 328 => real_part := 28707; imag_part := -15800;
            when 329 => real_part := 28683; imag_part := -15844;
            when 330 => real_part := 28658; imag_part := -15888;
            when 331 => real_part := 28634; imag_part := -15932;
            when 332 => real_part := 28610; imag_part := -15976;
            when 333 => real_part := 28585; imag_part := -16020;
            when 334 => real_part := 28560; imag_part := -16064;
            when 335 => real_part := 28536; imag_part := -16108;
            when 336 => real_part := 28511; imag_part := -16151;
            when 337 => real_part := 28486; imag_part := -16195;
            when 338 => real_part := 28461; imag_part := -16239;
            when 339 => real_part := 28436; imag_part := -16282;
            when 340 => real_part := 28411; imag_part := -16326;
            when 341 => real_part := 28386; imag_part := -16369;
            when 342 => real_part := 28361; imag_part := -16413;
            when 343 => real_part := 28336; imag_part := -16456;
            when 344 => real_part := 28311; imag_part := -16500;
            when 345 => real_part := 28285; imag_part := -16543;
            when 346 => real_part := 28260; imag_part := -16587;
            when 347 => real_part := 28234; imag_part := -16630;
            when 348 => real_part := 28209; imag_part := -16673;
            when 349 => real_part := 28183; imag_part := -16717;
            when 350 => real_part := 28158; imag_part := -16760;
            when 351 => real_part := 28132; imag_part := -16803;
            when 352 => real_part := 28106; imag_part := -16846;
            when 353 => real_part := 28080; imag_part := -16889;
            when 354 => real_part := 28054; imag_part := -16932;
            when 355 => real_part := 28028; imag_part := -16975;
            when 356 => real_part := 28002; imag_part := -17018;
            when 357 => real_part := 27976; imag_part := -17061;
            when 358 => real_part := 27950; imag_part := -17104;
            when 359 => real_part := 27924; imag_part := -17147;
            when 360 => real_part := 27897; imag_part := -17190;
            when 361 => real_part := 27871; imag_part := -17233;
            when 362 => real_part := 27844; imag_part := -17275;
            when 363 => real_part := 27818; imag_part := -17318;
            when 364 => real_part := 27791; imag_part := -17361;
            when 365 => real_part := 27765; imag_part := -17403;
            when 366 => real_part := 27738; imag_part := -17446;
            when 367 => real_part := 27711; imag_part := -17488;
            when 368 => real_part := 27684; imag_part := -17531;
            when 369 => real_part := 27657; imag_part := -17573;
            when 370 => real_part := 27630; imag_part := -17616;
            when 371 => real_part := 27603; imag_part := -17658;
            when 372 => real_part := 27576; imag_part := -17700;
            when 373 => real_part := 27549; imag_part := -17743;
            when 374 => real_part := 27522; imag_part := -17785;
            when 375 => real_part := 27494; imag_part := -17827;
            when 376 => real_part := 27467; imag_part := -17869;
            when 377 => real_part := 27440; imag_part := -17911;
            when 378 => real_part := 27412; imag_part := -17953;
            when 379 => real_part := 27384; imag_part := -17995;
            when 380 => real_part := 27357; imag_part := -18037;
            when 381 => real_part := 27329; imag_part := -18079;
            when 382 => real_part := 27301; imag_part := -18121;
            when 383 => real_part := 27273; imag_part := -18163;
            when 384 => real_part := 27246; imag_part := -18205;
            when 385 => real_part := 27218; imag_part := -18247;
            when 386 => real_part := 27190; imag_part := -18288;
            when 387 => real_part := 27162; imag_part := -18330;
            when 388 => real_part := 27133; imag_part := -18372;
            when 389 => real_part := 27105; imag_part := -18413;
            when 390 => real_part := 27077; imag_part := -18455;
            when 391 => real_part := 27049; imag_part := -18496;
            when 392 => real_part := 27020; imag_part := -18538;
            when 393 => real_part := 26992; imag_part := -18579;
            when 394 => real_part := 26963; imag_part := -18621;
            when 395 => real_part := 26935; imag_part := -18662;
            when 396 => real_part := 26906; imag_part := -18703;
            when 397 => real_part := 26877; imag_part := -18745;
            when 398 => real_part := 26848; imag_part := -18786;
            when 399 => real_part := 26820; imag_part := -18827;
            when 400 => real_part := 26791; imag_part := -18868;
            when 401 => real_part := 26762; imag_part := -18909;
            when 402 => real_part := 26733; imag_part := -18950;
            when 403 => real_part := 26704; imag_part := -18991;
            when 404 => real_part := 26674; imag_part := -19032;
            when 405 => real_part := 26645; imag_part := -19073;
            when 406 => real_part := 26616; imag_part := -19114;
            when 407 => real_part := 26586; imag_part := -19155;
            when 408 => real_part := 26557; imag_part := -19195;
            when 409 => real_part := 26528; imag_part := -19236;
            when 410 => real_part := 26498; imag_part := -19277;
            when 411 => real_part := 26468; imag_part := -19317;
            when 412 => real_part := 26439; imag_part := -19358;
            when 413 => real_part := 26409; imag_part := -19399;
            when 414 => real_part := 26379; imag_part := -19439;
            when 415 => real_part := 26349; imag_part := -19479;
            when 416 => real_part := 26320; imag_part := -19520;
            when 417 => real_part := 26290; imag_part := -19560;
            when 418 => real_part := 26259; imag_part := -19601;
            when 419 => real_part := 26229; imag_part := -19641;
            when 420 => real_part := 26199; imag_part := -19681;
            when 421 => real_part := 26169; imag_part := -19721;
            when 422 => real_part := 26139; imag_part := -19761;
            when 423 => real_part := 26108; imag_part := -19801;
            when 424 => real_part := 26078; imag_part := -19841;
            when 425 => real_part := 26048; imag_part := -19881;
            when 426 => real_part := 26017; imag_part := -19921;
            when 427 => real_part := 25986; imag_part := -19961;
            when 428 => real_part := 25956; imag_part := -20001;
            when 429 => real_part := 25925; imag_part := -20041;
            when 430 => real_part := 25894; imag_part := -20081;
            when 431 => real_part := 25863; imag_part := -20120;
            when 432 => real_part := 25833; imag_part := -20160;
            when 433 => real_part := 25802; imag_part := -20200;
            when 434 => real_part := 25771; imag_part := -20239;
            when 435 => real_part := 25739; imag_part := -20279;
            when 436 => real_part := 25708; imag_part := -20318;
            when 437 => real_part := 25677; imag_part := -20357;
            when 438 => real_part := 25646; imag_part := -20397;
            when 439 => real_part := 25615; imag_part := -20436;
            when 440 => real_part := 25583; imag_part := -20475;
            when 441 => real_part := 25552; imag_part := -20515;
            when 442 => real_part := 25520; imag_part := -20554;
            when 443 => real_part := 25489; imag_part := -20593;
            when 444 => real_part := 25457; imag_part := -20632;
            when 445 => real_part := 25425; imag_part := -20671;
            when 446 => real_part := 25394; imag_part := -20710;
            when 447 => real_part := 25362; imag_part := -20749;
            when 448 => real_part := 25330; imag_part := -20788;
            when 449 => real_part := 25298; imag_part := -20827;
            when 450 => real_part := 25266; imag_part := -20865;
            when 451 => real_part := 25234; imag_part := -20904;
            when 452 => real_part := 25202; imag_part := -20943;
            when 453 => real_part := 25170; imag_part := -20981;
            when 454 => real_part := 25138; imag_part := -21020;
            when 455 => real_part := 25105; imag_part := -21059;
            when 456 => real_part := 25073; imag_part := -21097;
            when 457 => real_part := 25041; imag_part := -21136;
            when 458 => real_part := 25008; imag_part := -21174;
            when 459 => real_part := 24976; imag_part := -21212;
            when 460 => real_part := 24943; imag_part := -21251;
            when 461 => real_part := 24910; imag_part := -21289;
            when 462 => real_part := 24878; imag_part := -21327;
            when 463 => real_part := 24845; imag_part := -21365;
            when 464 => real_part := 24812; imag_part := -21403;
            when 465 => real_part := 24779; imag_part := -21441;
            when 466 => real_part := 24746; imag_part := -21479;
            when 467 => real_part := 24713; imag_part := -21517;
            when 468 => real_part := 24680; imag_part := -21555;
            when 469 => real_part := 24647; imag_part := -21593;
            when 470 => real_part := 24614; imag_part := -21631;
            when 471 => real_part := 24581; imag_part := -21668;
            when 472 => real_part := 24548; imag_part := -21706;
            when 473 => real_part := 24514; imag_part := -21744;
            when 474 => real_part := 24481; imag_part := -21781;
            when 475 => real_part := 24448; imag_part := -21819;
            when 476 => real_part := 24414; imag_part := -21856;
            when 477 => real_part := 24380; imag_part := -21894;
            when 478 => real_part := 24347; imag_part := -21931;
            when 479 => real_part := 24313; imag_part := -21968;
            when 480 => real_part := 24279; imag_part := -22006;
            when 481 => real_part := 24246; imag_part := -22043;
            when 482 => real_part := 24212; imag_part := -22080;
            when 483 => real_part := 24178; imag_part := -22117;
            when 484 => real_part := 24144; imag_part := -22154;
            when 485 => real_part := 24110; imag_part := -22191;
            when 486 => real_part := 24076; imag_part := -22228;
            when 487 => real_part := 24042; imag_part := -22265;
            when 488 => real_part := 24008; imag_part := -22302;
            when 489 => real_part := 23973; imag_part := -22339;
            when 490 => real_part := 23939; imag_part := -22375;
            when 491 => real_part := 23905; imag_part := -22412;
            when 492 => real_part := 23870; imag_part := -22449;
            when 493 => real_part := 23836; imag_part := -22485;
            when 494 => real_part := 23801; imag_part := -22522;
            when 495 => real_part := 23767; imag_part := -22558;
            when 496 => real_part := 23732; imag_part := -22595;
            when 497 => real_part := 23697; imag_part := -22631;
            when 498 => real_part := 23663; imag_part := -22668;
            when 499 => real_part := 23628; imag_part := -22704;
            when 500 => real_part := 23593; imag_part := -22740;
            when 501 => real_part := 23558; imag_part := -22776;
            when 502 => real_part := 23523; imag_part := -22812;
            when 503 => real_part := 23488; imag_part := -22848;
            when 504 => real_part := 23453; imag_part := -22884;
            when 505 => real_part := 23418; imag_part := -22920;
            when 506 => real_part := 23383; imag_part := -22956;
            when 507 => real_part := 23348; imag_part := -22992;
            when 508 => real_part := 23312; imag_part := -23028;
            when 509 => real_part := 23277; imag_part := -23064;
            when 510 => real_part := 23241; imag_part := -23099;
            when 511 => real_part := 23206; imag_part := -23135;
            when 512 => real_part := 23170; imag_part := -23170;
            when 513 => real_part := 23135; imag_part := -23206;
            when 514 => real_part := 23099; imag_part := -23241;
            when 515 => real_part := 23064; imag_part := -23277;
            when 516 => real_part := 23028; imag_part := -23312;
            when 517 => real_part := 22992; imag_part := -23348;
            when 518 => real_part := 22956; imag_part := -23383;
            when 519 => real_part := 22920; imag_part := -23418;
            when 520 => real_part := 22884; imag_part := -23453;
            when 521 => real_part := 22848; imag_part := -23488;
            when 522 => real_part := 22812; imag_part := -23523;
            when 523 => real_part := 22776; imag_part := -23558;
            when 524 => real_part := 22740; imag_part := -23593;
            when 525 => real_part := 22704; imag_part := -23628;
            when 526 => real_part := 22668; imag_part := -23663;
            when 527 => real_part := 22631; imag_part := -23697;
            when 528 => real_part := 22595; imag_part := -23732;
            when 529 => real_part := 22558; imag_part := -23767;
            when 530 => real_part := 22522; imag_part := -23801;
            when 531 => real_part := 22485; imag_part := -23836;
            when 532 => real_part := 22449; imag_part := -23870;
            when 533 => real_part := 22412; imag_part := -23905;
            when 534 => real_part := 22375; imag_part := -23939;
            when 535 => real_part := 22339; imag_part := -23973;
            when 536 => real_part := 22302; imag_part := -24008;
            when 537 => real_part := 22265; imag_part := -24042;
            when 538 => real_part := 22228; imag_part := -24076;
            when 539 => real_part := 22191; imag_part := -24110;
            when 540 => real_part := 22154; imag_part := -24144;
            when 541 => real_part := 22117; imag_part := -24178;
            when 542 => real_part := 22080; imag_part := -24212;
            when 543 => real_part := 22043; imag_part := -24246;
            when 544 => real_part := 22006; imag_part := -24279;
            when 545 => real_part := 21968; imag_part := -24313;
            when 546 => real_part := 21931; imag_part := -24347;
            when 547 => real_part := 21894; imag_part := -24380;
            when 548 => real_part := 21856; imag_part := -24414;
            when 549 => real_part := 21819; imag_part := -24448;
            when 550 => real_part := 21781; imag_part := -24481;
            when 551 => real_part := 21744; imag_part := -24514;
            when 552 => real_part := 21706; imag_part := -24548;
            when 553 => real_part := 21668; imag_part := -24581;
            when 554 => real_part := 21631; imag_part := -24614;
            when 555 => real_part := 21593; imag_part := -24647;
            when 556 => real_part := 21555; imag_part := -24680;
            when 557 => real_part := 21517; imag_part := -24713;
            when 558 => real_part := 21479; imag_part := -24746;
            when 559 => real_part := 21441; imag_part := -24779;
            when 560 => real_part := 21403; imag_part := -24812;
            when 561 => real_part := 21365; imag_part := -24845;
            when 562 => real_part := 21327; imag_part := -24878;
            when 563 => real_part := 21289; imag_part := -24910;
            when 564 => real_part := 21251; imag_part := -24943;
            when 565 => real_part := 21212; imag_part := -24976;
            when 566 => real_part := 21174; imag_part := -25008;
            when 567 => real_part := 21136; imag_part := -25041;
            when 568 => real_part := 21097; imag_part := -25073;
            when 569 => real_part := 21059; imag_part := -25105;
            when 570 => real_part := 21020; imag_part := -25138;
            when 571 => real_part := 20981; imag_part := -25170;
            when 572 => real_part := 20943; imag_part := -25202;
            when 573 => real_part := 20904; imag_part := -25234;
            when 574 => real_part := 20865; imag_part := -25266;
            when 575 => real_part := 20827; imag_part := -25298;
            when 576 => real_part := 20788; imag_part := -25330;
            when 577 => real_part := 20749; imag_part := -25362;
            when 578 => real_part := 20710; imag_part := -25394;
            when 579 => real_part := 20671; imag_part := -25425;
            when 580 => real_part := 20632; imag_part := -25457;
            when 581 => real_part := 20593; imag_part := -25489;
            when 582 => real_part := 20554; imag_part := -25520;
            when 583 => real_part := 20515; imag_part := -25552;
            when 584 => real_part := 20475; imag_part := -25583;
            when 585 => real_part := 20436; imag_part := -25615;
            when 586 => real_part := 20397; imag_part := -25646;
            when 587 => real_part := 20357; imag_part := -25677;
            when 588 => real_part := 20318; imag_part := -25708;
            when 589 => real_part := 20279; imag_part := -25739;
            when 590 => real_part := 20239; imag_part := -25771;
            when 591 => real_part := 20200; imag_part := -25802;
            when 592 => real_part := 20160; imag_part := -25833;
            when 593 => real_part := 20120; imag_part := -25863;
            when 594 => real_part := 20081; imag_part := -25894;
            when 595 => real_part := 20041; imag_part := -25925;
            when 596 => real_part := 20001; imag_part := -25956;
            when 597 => real_part := 19961; imag_part := -25986;
            when 598 => real_part := 19921; imag_part := -26017;
            when 599 => real_part := 19881; imag_part := -26048;
            when 600 => real_part := 19841; imag_part := -26078;
            when 601 => real_part := 19801; imag_part := -26108;
            when 602 => real_part := 19761; imag_part := -26139;
            when 603 => real_part := 19721; imag_part := -26169;
            when 604 => real_part := 19681; imag_part := -26199;
            when 605 => real_part := 19641; imag_part := -26229;
            when 606 => real_part := 19601; imag_part := -26259;
            when 607 => real_part := 19560; imag_part := -26290;
            when 608 => real_part := 19520; imag_part := -26320;
            when 609 => real_part := 19479; imag_part := -26349;
            when 610 => real_part := 19439; imag_part := -26379;
            when 611 => real_part := 19399; imag_part := -26409;
            when 612 => real_part := 19358; imag_part := -26439;
            when 613 => real_part := 19317; imag_part := -26468;
            when 614 => real_part := 19277; imag_part := -26498;
            when 615 => real_part := 19236; imag_part := -26528;
            when 616 => real_part := 19195; imag_part := -26557;
            when 617 => real_part := 19155; imag_part := -26586;
            when 618 => real_part := 19114; imag_part := -26616;
            when 619 => real_part := 19073; imag_part := -26645;
            when 620 => real_part := 19032; imag_part := -26674;
            when 621 => real_part := 18991; imag_part := -26704;
            when 622 => real_part := 18950; imag_part := -26733;
            when 623 => real_part := 18909; imag_part := -26762;
            when 624 => real_part := 18868; imag_part := -26791;
            when 625 => real_part := 18827; imag_part := -26820;
            when 626 => real_part := 18786; imag_part := -26848;
            when 627 => real_part := 18745; imag_part := -26877;
            when 628 => real_part := 18703; imag_part := -26906;
            when 629 => real_part := 18662; imag_part := -26935;
            when 630 => real_part := 18621; imag_part := -26963;
            when 631 => real_part := 18579; imag_part := -26992;
            when 632 => real_part := 18538; imag_part := -27020;
            when 633 => real_part := 18496; imag_part := -27049;
            when 634 => real_part := 18455; imag_part := -27077;
            when 635 => real_part := 18413; imag_part := -27105;
            when 636 => real_part := 18372; imag_part := -27133;
            when 637 => real_part := 18330; imag_part := -27162;
            when 638 => real_part := 18288; imag_part := -27190;
            when 639 => real_part := 18247; imag_part := -27218;
            when 640 => real_part := 18205; imag_part := -27246;
            when 641 => real_part := 18163; imag_part := -27273;
            when 642 => real_part := 18121; imag_part := -27301;
            when 643 => real_part := 18079; imag_part := -27329;
            when 644 => real_part := 18037; imag_part := -27357;
            when 645 => real_part := 17995; imag_part := -27384;
            when 646 => real_part := 17953; imag_part := -27412;
            when 647 => real_part := 17911; imag_part := -27440;
            when 648 => real_part := 17869; imag_part := -27467;
            when 649 => real_part := 17827; imag_part := -27494;
            when 650 => real_part := 17785; imag_part := -27522;
            when 651 => real_part := 17743; imag_part := -27549;
            when 652 => real_part := 17700; imag_part := -27576;
            when 653 => real_part := 17658; imag_part := -27603;
            when 654 => real_part := 17616; imag_part := -27630;
            when 655 => real_part := 17573; imag_part := -27657;
            when 656 => real_part := 17531; imag_part := -27684;
            when 657 => real_part := 17488; imag_part := -27711;
            when 658 => real_part := 17446; imag_part := -27738;
            when 659 => real_part := 17403; imag_part := -27765;
            when 660 => real_part := 17361; imag_part := -27791;
            when 661 => real_part := 17318; imag_part := -27818;
            when 662 => real_part := 17275; imag_part := -27844;
            when 663 => real_part := 17233; imag_part := -27871;
            when 664 => real_part := 17190; imag_part := -27897;
            when 665 => real_part := 17147; imag_part := -27924;
            when 666 => real_part := 17104; imag_part := -27950;
            when 667 => real_part := 17061; imag_part := -27976;
            when 668 => real_part := 17018; imag_part := -28002;
            when 669 => real_part := 16975; imag_part := -28028;
            when 670 => real_part := 16932; imag_part := -28054;
            when 671 => real_part := 16889; imag_part := -28080;
            when 672 => real_part := 16846; imag_part := -28106;
            when 673 => real_part := 16803; imag_part := -28132;
            when 674 => real_part := 16760; imag_part := -28158;
            when 675 => real_part := 16717; imag_part := -28183;
            when 676 => real_part := 16673; imag_part := -28209;
            when 677 => real_part := 16630; imag_part := -28234;
            when 678 => real_part := 16587; imag_part := -28260;
            when 679 => real_part := 16543; imag_part := -28285;
            when 680 => real_part := 16500; imag_part := -28311;
            when 681 => real_part := 16456; imag_part := -28336;
            when 682 => real_part := 16413; imag_part := -28361;
            when 683 => real_part := 16369; imag_part := -28386;
            when 684 => real_part := 16326; imag_part := -28411;
            when 685 => real_part := 16282; imag_part := -28436;
            when 686 => real_part := 16239; imag_part := -28461;
            when 687 => real_part := 16195; imag_part := -28486;
            when 688 => real_part := 16151; imag_part := -28511;
            when 689 => real_part := 16108; imag_part := -28536;
            when 690 => real_part := 16064; imag_part := -28560;
            when 691 => real_part := 16020; imag_part := -28585;
            when 692 => real_part := 15976; imag_part := -28610;
            when 693 => real_part := 15932; imag_part := -28634;
            when 694 => real_part := 15888; imag_part := -28658;
            when 695 => real_part := 15844; imag_part := -28683;
            when 696 => real_part := 15800; imag_part := -28707;
            when 697 => real_part := 15756; imag_part := -28731;
            when 698 => real_part := 15712; imag_part := -28755;
            when 699 => real_part := 15668; imag_part := -28779;
            when 700 => real_part := 15624; imag_part := -28803;
            when 701 => real_part := 15580; imag_part := -28827;
            when 702 => real_part := 15535; imag_part := -28851;
            when 703 => real_part := 15491; imag_part := -28875;
            when 704 => real_part := 15447; imag_part := -28899;
            when 705 => real_part := 15402; imag_part := -28922;
            when 706 => real_part := 15358; imag_part := -28946;
            when 707 => real_part := 15314; imag_part := -28970;
            when 708 => real_part := 15269; imag_part := -28993;
            when 709 => real_part := 15225; imag_part := -29016;
            when 710 => real_part := 15180; imag_part := -29040;
            when 711 => real_part := 15136; imag_part := -29063;
            when 712 => real_part := 15091; imag_part := -29086;
            when 713 => real_part := 15046; imag_part := -29109;
            when 714 => real_part := 15002; imag_part := -29132;
            when 715 => real_part := 14957; imag_part := -29155;
            when 716 => real_part := 14912; imag_part := -29178;
            when 717 => real_part := 14867; imag_part := -29201;
            when 718 => real_part := 14823; imag_part := -29224;
            when 719 => real_part := 14778; imag_part := -29247;
            when 720 => real_part := 14733; imag_part := -29269;
            when 721 => real_part := 14688; imag_part := -29292;
            when 722 => real_part := 14643; imag_part := -29314;
            when 723 => real_part := 14598; imag_part := -29337;
            when 724 => real_part := 14553; imag_part := -29359;
            when 725 => real_part := 14508; imag_part := -29381;
            when 726 => real_part := 14463; imag_part := -29404;
            when 727 => real_part := 14418; imag_part := -29426;
            when 728 => real_part := 14373; imag_part := -29448;
            when 729 => real_part := 14327; imag_part := -29470;
            when 730 => real_part := 14282; imag_part := -29492;
            when 731 => real_part := 14237; imag_part := -29514;
            when 732 => real_part := 14192; imag_part := -29535;
            when 733 => real_part := 14146; imag_part := -29557;
            when 734 => real_part := 14101; imag_part := -29579;
            when 735 => real_part := 14056; imag_part := -29600;
            when 736 => real_part := 14010; imag_part := -29622;
            when 737 => real_part := 13965; imag_part := -29643;
            when 738 => real_part := 13919; imag_part := -29665;
            when 739 => real_part := 13874; imag_part := -29686;
            when 740 => real_part := 13828; imag_part := -29707;
            when 741 => real_part := 13783; imag_part := -29729;
            when 742 => real_part := 13737; imag_part := -29750;
            when 743 => real_part := 13691; imag_part := -29771;
            when 744 => real_part := 13646; imag_part := -29792;
            when 745 => real_part := 13600; imag_part := -29813;
            when 746 => real_part := 13554; imag_part := -29833;
            when 747 => real_part := 13508; imag_part := -29854;
            when 748 => real_part := 13463; imag_part := -29875;
            when 749 => real_part := 13417; imag_part := -29895;
            when 750 => real_part := 13371; imag_part := -29916;
            when 751 => real_part := 13325; imag_part := -29936;
            when 752 => real_part := 13279; imag_part := -29957;
            when 753 => real_part := 13233; imag_part := -29977;
            when 754 => real_part := 13187; imag_part := -29997;
            when 755 => real_part := 13141; imag_part := -30018;
            when 756 => real_part := 13095; imag_part := -30038;
            when 757 => real_part := 13049; imag_part := -30058;
            when 758 => real_part := 13003; imag_part := -30078;
            when 759 => real_part := 12957; imag_part := -30098;
            when 760 => real_part := 12910; imag_part := -30118;
            when 761 => real_part := 12864; imag_part := -30137;
            when 762 => real_part := 12818; imag_part := -30157;
            when 763 => real_part := 12772; imag_part := -30177;
            when 764 => real_part := 12725; imag_part := -30196;
            when 765 => real_part := 12679; imag_part := -30216;
            when 766 => real_part := 12633; imag_part := -30235;
            when 767 => real_part := 12586; imag_part := -30254;
            when 768 => real_part := 12540; imag_part := -30274;
            when 769 => real_part := 12493; imag_part := -30293;
            when 770 => real_part := 12447; imag_part := -30312;
            when 771 => real_part := 12400; imag_part := -30331;
            when 772 => real_part := 12354; imag_part := -30350;
            when 773 => real_part := 12307; imag_part := -30369;
            when 774 => real_part := 12261; imag_part := -30388;
            when 775 => real_part := 12214; imag_part := -30407;
            when 776 => real_part := 12167; imag_part := -30425;
            when 777 => real_part := 12121; imag_part := -30444;
            when 778 => real_part := 12074; imag_part := -30462;
            when 779 => real_part := 12027; imag_part := -30481;
            when 780 => real_part := 11980; imag_part := -30499;
            when 781 => real_part := 11934; imag_part := -30518;
            when 782 => real_part := 11887; imag_part := -30536;
            when 783 => real_part := 11840; imag_part := -30554;
            when 784 => real_part := 11793; imag_part := -30572;
            when 785 => real_part := 11746; imag_part := -30590;
            when 786 => real_part := 11699; imag_part := -30608;
            when 787 => real_part := 11652; imag_part := -30626;
            when 788 => real_part := 11605; imag_part := -30644;
            when 789 => real_part := 11558; imag_part := -30662;
            when 790 => real_part := 11511; imag_part := -30680;
            when 791 => real_part := 11464; imag_part := -30697;
            when 792 => real_part := 11417; imag_part := -30715;
            when 793 => real_part := 11370; imag_part := -30732;
            when 794 => real_part := 11323; imag_part := -30750;
            when 795 => real_part := 11276; imag_part := -30767;
            when 796 => real_part := 11228; imag_part := -30784;
            when 797 => real_part := 11181; imag_part := -30801;
            when 798 => real_part := 11134; imag_part := -30819;
            when 799 => real_part := 11087; imag_part := -30836;
            when 800 => real_part := 11039; imag_part := -30853;
            when 801 => real_part := 10992; imag_part := -30869;
            when 802 => real_part := 10945; imag_part := -30886;
            when 803 => real_part := 10897; imag_part := -30903;
            when 804 => real_part := 10850; imag_part := -30920;
            when 805 => real_part := 10802; imag_part := -30936;
            when 806 => real_part := 10755; imag_part := -30953;
            when 807 => real_part := 10707; imag_part := -30969;
            when 808 => real_part := 10660; imag_part := -30986;
            when 809 => real_part := 10612; imag_part := -31002;
            when 810 => real_part := 10565; imag_part := -31018;
            when 811 => real_part := 10517; imag_part := -31034;
            when 812 => real_part := 10469; imag_part := -31050;
            when 813 => real_part := 10422; imag_part := -31067;
            when 814 => real_part := 10374; imag_part := -31082;
            when 815 => real_part := 10326; imag_part := -31098;
            when 816 => real_part := 10279; imag_part := -31114;
            when 817 => real_part := 10231; imag_part := -31130;
            when 818 => real_part := 10183; imag_part := -31146;
            when 819 => real_part := 10135; imag_part := -31161;
            when 820 => real_part := 10088; imag_part := -31177;
            when 821 => real_part := 10040; imag_part := -31192;
            when 822 => real_part := 9992; imag_part := -31207;
            when 823 => real_part := 9944; imag_part := -31223;
            when 824 => real_part := 9896; imag_part := -31238;
            when 825 => real_part := 9848; imag_part := -31253;
            when 826 => real_part := 9800; imag_part := -31268;
            when 827 => real_part := 9752; imag_part := -31283;
            when 828 => real_part := 9704; imag_part := -31298;
            when 829 => real_part := 9656; imag_part := -31313;
            when 830 => real_part := 9608; imag_part := -31328;
            when 831 => real_part := 9560; imag_part := -31342;
            when 832 => real_part := 9512; imag_part := -31357;
            when 833 => real_part := 9464; imag_part := -31372;
            when 834 => real_part := 9416; imag_part := -31386;
            when 835 => real_part := 9368; imag_part := -31400;
            when 836 => real_part := 9319; imag_part := -31415;
            when 837 => real_part := 9271; imag_part := -31429;
            when 838 => real_part := 9223; imag_part := -31443;
            when 839 => real_part := 9175; imag_part := -31457;
            when 840 => real_part := 9127; imag_part := -31471;
            when 841 => real_part := 9078; imag_part := -31485;
            when 842 => real_part := 9030; imag_part := -31499;
            when 843 => real_part := 8982; imag_part := -31513;
            when 844 => real_part := 8933; imag_part := -31527;
            when 845 => real_part := 8885; imag_part := -31540;
            when 846 => real_part := 8836; imag_part := -31554;
            when 847 => real_part := 8788; imag_part := -31568;
            when 848 => real_part := 8740; imag_part := -31581;
            when 849 => real_part := 8691; imag_part := -31594;
            when 850 => real_part := 8643; imag_part := -31608;
            when 851 => real_part := 8594; imag_part := -31621;
            when 852 => real_part := 8546; imag_part := -31634;
            when 853 => real_part := 8497; imag_part := -31647;
            when 854 => real_part := 8449; imag_part := -31660;
            when 855 => real_part := 8400; imag_part := -31673;
            when 856 => real_part := 8351; imag_part := -31686;
            when 857 => real_part := 8303; imag_part := -31699;
            when 858 => real_part := 8254; imag_part := -31711;
            when 859 => real_part := 8206; imag_part := -31724;
            when 860 => real_part := 8157; imag_part := -31737;
            when 861 => real_part := 8108; imag_part := -31749;
            when 862 => real_part := 8059; imag_part := -31761;
            when 863 => real_part := 8011; imag_part := -31774;
            when 864 => real_part := 7962; imag_part := -31786;
            when 865 => real_part := 7913; imag_part := -31798;
            when 866 => real_part := 7864; imag_part := -31810;
            when 867 => real_part := 7816; imag_part := -31822;
            when 868 => real_part := 7767; imag_part := -31834;
            when 869 => real_part := 7718; imag_part := -31846;
            when 870 => real_part := 7669; imag_part := -31858;
            when 871 => real_part := 7620; imag_part := -31870;
            when 872 => real_part := 7571; imag_part := -31881;
            when 873 => real_part := 7522; imag_part := -31893;
            when 874 => real_part := 7473; imag_part := -31904;
            when 875 => real_part := 7425; imag_part := -31916;
            when 876 => real_part := 7376; imag_part := -31927;
            when 877 => real_part := 7327; imag_part := -31938;
            when 878 => real_part := 7278; imag_part := -31950;
            when 879 => real_part := 7229; imag_part := -31961;
            when 880 => real_part := 7180; imag_part := -31972;
            when 881 => real_part := 7130; imag_part := -31983;
            when 882 => real_part := 7081; imag_part := -31994;
            when 883 => real_part := 7032; imag_part := -32005;
            when 884 => real_part := 6983; imag_part := -32015;
            when 885 => real_part := 6934; imag_part := -32026;
            when 886 => real_part := 6885; imag_part := -32037;
            when 887 => real_part := 6836; imag_part := -32047;
            when 888 => real_part := 6787; imag_part := -32058;
            when 889 => real_part := 6737; imag_part := -32068;
            when 890 => real_part := 6688; imag_part := -32078;
            when 891 => real_part := 6639; imag_part := -32088;
            when 892 => real_part := 6590; imag_part := -32099;
            when 893 => real_part := 6541; imag_part := -32109;
            when 894 => real_part := 6491; imag_part := -32119;
            when 895 => real_part := 6442; imag_part := -32129;
            when 896 => real_part := 6393; imag_part := -32138;
            when 897 => real_part := 6343; imag_part := -32148;
            when 898 => real_part := 6294; imag_part := -32158;
            when 899 => real_part := 6245; imag_part := -32167;
            when 900 => real_part := 6195; imag_part := -32177;
            when 901 => real_part := 6146; imag_part := -32186;
            when 902 => real_part := 6097; imag_part := -32196;
            when 903 => real_part := 6047; imag_part := -32205;
            when 904 => real_part := 5998; imag_part := -32214;
            when 905 => real_part := 5948; imag_part := -32224;
            when 906 => real_part := 5899; imag_part := -32233;
            when 907 => real_part := 5850; imag_part := -32242;
            when 908 => real_part := 5800; imag_part := -32251;
            when 909 => real_part := 5751; imag_part := -32259;
            when 910 => real_part := 5701; imag_part := -32268;
            when 911 => real_part := 5652; imag_part := -32277;
            when 912 => real_part := 5602; imag_part := -32286;
            when 913 => real_part := 5553; imag_part := -32294;
            when 914 => real_part := 5503; imag_part := -32303;
            when 915 => real_part := 5453; imag_part := -32311;
            when 916 => real_part := 5404; imag_part := -32319;
            when 917 => real_part := 5354; imag_part := -32328;
            when 918 => real_part := 5305; imag_part := -32336;
            when 919 => real_part := 5255; imag_part := -32344;
            when 920 => real_part := 5205; imag_part := -32352;
            when 921 => real_part := 5156; imag_part := -32360;
            when 922 => real_part := 5106; imag_part := -32368;
            when 923 => real_part := 5057; imag_part := -32376;
            when 924 => real_part := 5007; imag_part := -32383;
            when 925 => real_part := 4957; imag_part := -32391;
            when 926 => real_part := 4907; imag_part := -32398;
            when 927 => real_part := 4858; imag_part := -32406;
            when 928 => real_part := 4808; imag_part := -32413;
            when 929 => real_part := 4758; imag_part := -32421;
            when 930 => real_part := 4709; imag_part := -32428;
            when 931 => real_part := 4659; imag_part := -32435;
            when 932 => real_part := 4609; imag_part := -32442;
            when 933 => real_part := 4559; imag_part := -32449;
            when 934 => real_part := 4510; imag_part := -32456;
            when 935 => real_part := 4460; imag_part := -32463;
            when 936 => real_part := 4410; imag_part := -32470;
            when 937 => real_part := 4360; imag_part := -32477;
            when 938 => real_part := 4310; imag_part := -32483;
            when 939 => real_part := 4260; imag_part := -32490;
            when 940 => real_part := 4211; imag_part := -32496;
            when 941 => real_part := 4161; imag_part := -32503;
            when 942 => real_part := 4111; imag_part := -32509;
            when 943 => real_part := 4061; imag_part := -32515;
            when 944 => real_part := 4011; imag_part := -32522;
            when 945 => real_part := 3961; imag_part := -32528;
            when 946 => real_part := 3911; imag_part := -32534;
            when 947 => real_part := 3861; imag_part := -32540;
            when 948 => real_part := 3812; imag_part := -32546;
            when 949 => real_part := 3762; imag_part := -32551;
            when 950 => real_part := 3712; imag_part := -32557;
            when 951 => real_part := 3662; imag_part := -32563;
            when 952 => real_part := 3612; imag_part := -32568;
            when 953 => real_part := 3562; imag_part := -32574;
            when 954 => real_part := 3512; imag_part := -32579;
            when 955 => real_part := 3462; imag_part := -32585;
            when 956 => real_part := 3412; imag_part := -32590;
            when 957 => real_part := 3362; imag_part := -32595;
            when 958 => real_part := 3312; imag_part := -32600;
            when 959 => real_part := 3262; imag_part := -32605;
            when 960 => real_part := 3212; imag_part := -32610;
            when 961 => real_part := 3162; imag_part := -32615;
            when 962 => real_part := 3112; imag_part := -32620;
            when 963 => real_part := 3062; imag_part := -32625;
            when 964 => real_part := 3012; imag_part := -32629;
            when 965 => real_part := 2962; imag_part := -32634;
            when 966 => real_part := 2912; imag_part := -32638;
            when 967 => real_part := 2861; imag_part := -32643;
            when 968 => real_part := 2811; imag_part := -32647;
            when 969 => real_part := 2761; imag_part := -32651;
            when 970 => real_part := 2711; imag_part := -32656;
            when 971 => real_part := 2661; imag_part := -32660;
            when 972 => real_part := 2611; imag_part := -32664;
            when 973 => real_part := 2561; imag_part := -32668;
            when 974 => real_part := 2511; imag_part := -32672;
            when 975 => real_part := 2461; imag_part := -32675;
            when 976 => real_part := 2411; imag_part := -32679;
            when 977 => real_part := 2360; imag_part := -32683;
            when 978 => real_part := 2310; imag_part := -32686;
            when 979 => real_part := 2260; imag_part := -32690;
            when 980 => real_part := 2210; imag_part := -32693;
            when 981 => real_part := 2160; imag_part := -32697;
            when 982 => real_part := 2110; imag_part := -32700;
            when 983 => real_part := 2060; imag_part := -32703;
            when 984 => real_part := 2009; imag_part := -32706;
            when 985 => real_part := 1959; imag_part := -32709;
            when 986 => real_part := 1909; imag_part := -32712;
            when 987 => real_part := 1859; imag_part := -32715;
            when 988 => real_part := 1809; imag_part := -32718;
            when 989 => real_part := 1758; imag_part := -32721;
            when 990 => real_part := 1708; imag_part := -32723;
            when 991 => real_part := 1658; imag_part := -32726;
            when 992 => real_part := 1608; imag_part := -32729;
            when 993 => real_part := 1558; imag_part := -32731;
            when 994 => real_part := 1507; imag_part := -32733;
            when 995 => real_part := 1457; imag_part := -32736;
            when 996 => real_part := 1407; imag_part := -32738;
            when 997 => real_part := 1357; imag_part := -32740;
            when 998 => real_part := 1307; imag_part := -32742;
            when 999 => real_part := 1256; imag_part := -32744;
            when 1000 => real_part := 1206; imag_part := -32746;
            when 1001 => real_part := 1156; imag_part := -32748;
            when 1002 => real_part := 1106; imag_part := -32749;
            when 1003 => real_part := 1055; imag_part := -32751;
            when 1004 => real_part := 1005; imag_part := -32753;
            when 1005 => real_part := 955; imag_part := -32754;
            when 1006 => real_part := 905; imag_part := -32756;
            when 1007 => real_part := 854; imag_part := -32757;
            when 1008 => real_part := 804; imag_part := -32758;
            when 1009 => real_part := 754; imag_part := -32759;
            when 1010 => real_part := 704; imag_part := -32760;
            when 1011 => real_part := 653; imag_part := -32761;
            when 1012 => real_part := 603; imag_part := -32762;
            when 1013 => real_part := 553; imag_part := -32763;
            when 1014 => real_part := 503; imag_part := -32764;
            when 1015 => real_part := 452; imag_part := -32765;
            when 1016 => real_part := 402; imag_part := -32766;
            when 1017 => real_part := 352; imag_part := -32766;
            when 1018 => real_part := 302; imag_part := -32767;
            when 1019 => real_part := 251; imag_part := -32767;
            when 1020 => real_part := 201; imag_part := -32767;
            when 1021 => real_part := 151; imag_part := -32768;
            when 1022 => real_part := 101; imag_part := -32768;
            when 1023 => real_part := 50; imag_part := -32768;
            when 1024 => real_part := 0; imag_part := -32768;
            when 1025 => real_part := -50; imag_part := -32768;
            when 1026 => real_part := -101; imag_part := -32768;
            when 1027 => real_part := -151; imag_part := -32768;
            when 1028 => real_part := -201; imag_part := -32767;
            when 1029 => real_part := -251; imag_part := -32767;
            when 1030 => real_part := -302; imag_part := -32767;
            when 1031 => real_part := -352; imag_part := -32766;
            when 1032 => real_part := -402; imag_part := -32766;
            when 1033 => real_part := -452; imag_part := -32765;
            when 1034 => real_part := -503; imag_part := -32764;
            when 1035 => real_part := -553; imag_part := -32763;
            when 1036 => real_part := -603; imag_part := -32762;
            when 1037 => real_part := -653; imag_part := -32761;
            when 1038 => real_part := -704; imag_part := -32760;
            when 1039 => real_part := -754; imag_part := -32759;
            when 1040 => real_part := -804; imag_part := -32758;
            when 1041 => real_part := -854; imag_part := -32757;
            when 1042 => real_part := -905; imag_part := -32756;
            when 1043 => real_part := -955; imag_part := -32754;
            when 1044 => real_part := -1005; imag_part := -32753;
            when 1045 => real_part := -1055; imag_part := -32751;
            when 1046 => real_part := -1106; imag_part := -32749;
            when 1047 => real_part := -1156; imag_part := -32748;
            when 1048 => real_part := -1206; imag_part := -32746;
            when 1049 => real_part := -1256; imag_part := -32744;
            when 1050 => real_part := -1307; imag_part := -32742;
            when 1051 => real_part := -1357; imag_part := -32740;
            when 1052 => real_part := -1407; imag_part := -32738;
            when 1053 => real_part := -1457; imag_part := -32736;
            when 1054 => real_part := -1507; imag_part := -32733;
            when 1055 => real_part := -1558; imag_part := -32731;
            when 1056 => real_part := -1608; imag_part := -32729;
            when 1057 => real_part := -1658; imag_part := -32726;
            when 1058 => real_part := -1708; imag_part := -32723;
            when 1059 => real_part := -1758; imag_part := -32721;
            when 1060 => real_part := -1809; imag_part := -32718;
            when 1061 => real_part := -1859; imag_part := -32715;
            when 1062 => real_part := -1909; imag_part := -32712;
            when 1063 => real_part := -1959; imag_part := -32709;
            when 1064 => real_part := -2009; imag_part := -32706;
            when 1065 => real_part := -2060; imag_part := -32703;
            when 1066 => real_part := -2110; imag_part := -32700;
            when 1067 => real_part := -2160; imag_part := -32697;
            when 1068 => real_part := -2210; imag_part := -32693;
            when 1069 => real_part := -2260; imag_part := -32690;
            when 1070 => real_part := -2310; imag_part := -32686;
            when 1071 => real_part := -2360; imag_part := -32683;
            when 1072 => real_part := -2411; imag_part := -32679;
            when 1073 => real_part := -2461; imag_part := -32675;
            when 1074 => real_part := -2511; imag_part := -32672;
            when 1075 => real_part := -2561; imag_part := -32668;
            when 1076 => real_part := -2611; imag_part := -32664;
            when 1077 => real_part := -2661; imag_part := -32660;
            when 1078 => real_part := -2711; imag_part := -32656;
            when 1079 => real_part := -2761; imag_part := -32651;
            when 1080 => real_part := -2811; imag_part := -32647;
            when 1081 => real_part := -2861; imag_part := -32643;
            when 1082 => real_part := -2912; imag_part := -32638;
            when 1083 => real_part := -2962; imag_part := -32634;
            when 1084 => real_part := -3012; imag_part := -32629;
            when 1085 => real_part := -3062; imag_part := -32625;
            when 1086 => real_part := -3112; imag_part := -32620;
            when 1087 => real_part := -3162; imag_part := -32615;
            when 1088 => real_part := -3212; imag_part := -32610;
            when 1089 => real_part := -3262; imag_part := -32605;
            when 1090 => real_part := -3312; imag_part := -32600;
            when 1091 => real_part := -3362; imag_part := -32595;
            when 1092 => real_part := -3412; imag_part := -32590;
            when 1093 => real_part := -3462; imag_part := -32585;
            when 1094 => real_part := -3512; imag_part := -32579;
            when 1095 => real_part := -3562; imag_part := -32574;
            when 1096 => real_part := -3612; imag_part := -32568;
            when 1097 => real_part := -3662; imag_part := -32563;
            when 1098 => real_part := -3712; imag_part := -32557;
            when 1099 => real_part := -3762; imag_part := -32551;
            when 1100 => real_part := -3812; imag_part := -32546;
            when 1101 => real_part := -3861; imag_part := -32540;
            when 1102 => real_part := -3911; imag_part := -32534;
            when 1103 => real_part := -3961; imag_part := -32528;
            when 1104 => real_part := -4011; imag_part := -32522;
            when 1105 => real_part := -4061; imag_part := -32515;
            when 1106 => real_part := -4111; imag_part := -32509;
            when 1107 => real_part := -4161; imag_part := -32503;
            when 1108 => real_part := -4211; imag_part := -32496;
            when 1109 => real_part := -4260; imag_part := -32490;
            when 1110 => real_part := -4310; imag_part := -32483;
            when 1111 => real_part := -4360; imag_part := -32477;
            when 1112 => real_part := -4410; imag_part := -32470;
            when 1113 => real_part := -4460; imag_part := -32463;
            when 1114 => real_part := -4510; imag_part := -32456;
            when 1115 => real_part := -4559; imag_part := -32449;
            when 1116 => real_part := -4609; imag_part := -32442;
            when 1117 => real_part := -4659; imag_part := -32435;
            when 1118 => real_part := -4709; imag_part := -32428;
            when 1119 => real_part := -4758; imag_part := -32421;
            when 1120 => real_part := -4808; imag_part := -32413;
            when 1121 => real_part := -4858; imag_part := -32406;
            when 1122 => real_part := -4907; imag_part := -32398;
            when 1123 => real_part := -4957; imag_part := -32391;
            when 1124 => real_part := -5007; imag_part := -32383;
            when 1125 => real_part := -5057; imag_part := -32376;
            when 1126 => real_part := -5106; imag_part := -32368;
            when 1127 => real_part := -5156; imag_part := -32360;
            when 1128 => real_part := -5205; imag_part := -32352;
            when 1129 => real_part := -5255; imag_part := -32344;
            when 1130 => real_part := -5305; imag_part := -32336;
            when 1131 => real_part := -5354; imag_part := -32328;
            when 1132 => real_part := -5404; imag_part := -32319;
            when 1133 => real_part := -5453; imag_part := -32311;
            when 1134 => real_part := -5503; imag_part := -32303;
            when 1135 => real_part := -5553; imag_part := -32294;
            when 1136 => real_part := -5602; imag_part := -32286;
            when 1137 => real_part := -5652; imag_part := -32277;
            when 1138 => real_part := -5701; imag_part := -32268;
            when 1139 => real_part := -5751; imag_part := -32259;
            when 1140 => real_part := -5800; imag_part := -32251;
            when 1141 => real_part := -5850; imag_part := -32242;
            when 1142 => real_part := -5899; imag_part := -32233;
            when 1143 => real_part := -5948; imag_part := -32224;
            when 1144 => real_part := -5998; imag_part := -32214;
            when 1145 => real_part := -6047; imag_part := -32205;
            when 1146 => real_part := -6097; imag_part := -32196;
            when 1147 => real_part := -6146; imag_part := -32186;
            when 1148 => real_part := -6195; imag_part := -32177;
            when 1149 => real_part := -6245; imag_part := -32167;
            when 1150 => real_part := -6294; imag_part := -32158;
            when 1151 => real_part := -6343; imag_part := -32148;
            when 1152 => real_part := -6393; imag_part := -32138;
            when 1153 => real_part := -6442; imag_part := -32129;
            when 1154 => real_part := -6491; imag_part := -32119;
            when 1155 => real_part := -6541; imag_part := -32109;
            when 1156 => real_part := -6590; imag_part := -32099;
            when 1157 => real_part := -6639; imag_part := -32088;
            when 1158 => real_part := -6688; imag_part := -32078;
            when 1159 => real_part := -6737; imag_part := -32068;
            when 1160 => real_part := -6787; imag_part := -32058;
            when 1161 => real_part := -6836; imag_part := -32047;
            when 1162 => real_part := -6885; imag_part := -32037;
            when 1163 => real_part := -6934; imag_part := -32026;
            when 1164 => real_part := -6983; imag_part := -32015;
            when 1165 => real_part := -7032; imag_part := -32005;
            when 1166 => real_part := -7081; imag_part := -31994;
            when 1167 => real_part := -7130; imag_part := -31983;
            when 1168 => real_part := -7180; imag_part := -31972;
            when 1169 => real_part := -7229; imag_part := -31961;
            when 1170 => real_part := -7278; imag_part := -31950;
            when 1171 => real_part := -7327; imag_part := -31938;
            when 1172 => real_part := -7376; imag_part := -31927;
            when 1173 => real_part := -7425; imag_part := -31916;
            when 1174 => real_part := -7473; imag_part := -31904;
            when 1175 => real_part := -7522; imag_part := -31893;
            when 1176 => real_part := -7571; imag_part := -31881;
            when 1177 => real_part := -7620; imag_part := -31870;
            when 1178 => real_part := -7669; imag_part := -31858;
            when 1179 => real_part := -7718; imag_part := -31846;
            when 1180 => real_part := -7767; imag_part := -31834;
            when 1181 => real_part := -7816; imag_part := -31822;
            when 1182 => real_part := -7864; imag_part := -31810;
            when 1183 => real_part := -7913; imag_part := -31798;
            when 1184 => real_part := -7962; imag_part := -31786;
            when 1185 => real_part := -8011; imag_part := -31774;
            when 1186 => real_part := -8059; imag_part := -31761;
            when 1187 => real_part := -8108; imag_part := -31749;
            when 1188 => real_part := -8157; imag_part := -31737;
            when 1189 => real_part := -8206; imag_part := -31724;
            when 1190 => real_part := -8254; imag_part := -31711;
            when 1191 => real_part := -8303; imag_part := -31699;
            when 1192 => real_part := -8351; imag_part := -31686;
            when 1193 => real_part := -8400; imag_part := -31673;
            when 1194 => real_part := -8449; imag_part := -31660;
            when 1195 => real_part := -8497; imag_part := -31647;
            when 1196 => real_part := -8546; imag_part := -31634;
            when 1197 => real_part := -8594; imag_part := -31621;
            when 1198 => real_part := -8643; imag_part := -31608;
            when 1199 => real_part := -8691; imag_part := -31594;
            when 1200 => real_part := -8740; imag_part := -31581;
            when 1201 => real_part := -8788; imag_part := -31568;
            when 1202 => real_part := -8836; imag_part := -31554;
            when 1203 => real_part := -8885; imag_part := -31540;
            when 1204 => real_part := -8933; imag_part := -31527;
            when 1205 => real_part := -8982; imag_part := -31513;
            when 1206 => real_part := -9030; imag_part := -31499;
            when 1207 => real_part := -9078; imag_part := -31485;
            when 1208 => real_part := -9127; imag_part := -31471;
            when 1209 => real_part := -9175; imag_part := -31457;
            when 1210 => real_part := -9223; imag_part := -31443;
            when 1211 => real_part := -9271; imag_part := -31429;
            when 1212 => real_part := -9319; imag_part := -31415;
            when 1213 => real_part := -9368; imag_part := -31400;
            when 1214 => real_part := -9416; imag_part := -31386;
            when 1215 => real_part := -9464; imag_part := -31372;
            when 1216 => real_part := -9512; imag_part := -31357;
            when 1217 => real_part := -9560; imag_part := -31342;
            when 1218 => real_part := -9608; imag_part := -31328;
            when 1219 => real_part := -9656; imag_part := -31313;
            when 1220 => real_part := -9704; imag_part := -31298;
            when 1221 => real_part := -9752; imag_part := -31283;
            when 1222 => real_part := -9800; imag_part := -31268;
            when 1223 => real_part := -9848; imag_part := -31253;
            when 1224 => real_part := -9896; imag_part := -31238;
            when 1225 => real_part := -9944; imag_part := -31223;
            when 1226 => real_part := -9992; imag_part := -31207;
            when 1227 => real_part := -10040; imag_part := -31192;
            when 1228 => real_part := -10088; imag_part := -31177;
            when 1229 => real_part := -10135; imag_part := -31161;
            when 1230 => real_part := -10183; imag_part := -31146;
            when 1231 => real_part := -10231; imag_part := -31130;
            when 1232 => real_part := -10279; imag_part := -31114;
            when 1233 => real_part := -10326; imag_part := -31098;
            when 1234 => real_part := -10374; imag_part := -31082;
            when 1235 => real_part := -10422; imag_part := -31067;
            when 1236 => real_part := -10469; imag_part := -31050;
            when 1237 => real_part := -10517; imag_part := -31034;
            when 1238 => real_part := -10565; imag_part := -31018;
            when 1239 => real_part := -10612; imag_part := -31002;
            when 1240 => real_part := -10660; imag_part := -30986;
            when 1241 => real_part := -10707; imag_part := -30969;
            when 1242 => real_part := -10755; imag_part := -30953;
            when 1243 => real_part := -10802; imag_part := -30936;
            when 1244 => real_part := -10850; imag_part := -30920;
            when 1245 => real_part := -10897; imag_part := -30903;
            when 1246 => real_part := -10945; imag_part := -30886;
            when 1247 => real_part := -10992; imag_part := -30869;
            when 1248 => real_part := -11039; imag_part := -30853;
            when 1249 => real_part := -11087; imag_part := -30836;
            when 1250 => real_part := -11134; imag_part := -30819;
            when 1251 => real_part := -11181; imag_part := -30801;
            when 1252 => real_part := -11228; imag_part := -30784;
            when 1253 => real_part := -11276; imag_part := -30767;
            when 1254 => real_part := -11323; imag_part := -30750;
            when 1255 => real_part := -11370; imag_part := -30732;
            when 1256 => real_part := -11417; imag_part := -30715;
            when 1257 => real_part := -11464; imag_part := -30697;
            when 1258 => real_part := -11511; imag_part := -30680;
            when 1259 => real_part := -11558; imag_part := -30662;
            when 1260 => real_part := -11605; imag_part := -30644;
            when 1261 => real_part := -11652; imag_part := -30626;
            when 1262 => real_part := -11699; imag_part := -30608;
            when 1263 => real_part := -11746; imag_part := -30590;
            when 1264 => real_part := -11793; imag_part := -30572;
            when 1265 => real_part := -11840; imag_part := -30554;
            when 1266 => real_part := -11887; imag_part := -30536;
            when 1267 => real_part := -11934; imag_part := -30518;
            when 1268 => real_part := -11980; imag_part := -30499;
            when 1269 => real_part := -12027; imag_part := -30481;
            when 1270 => real_part := -12074; imag_part := -30462;
            when 1271 => real_part := -12121; imag_part := -30444;
            when 1272 => real_part := -12167; imag_part := -30425;
            when 1273 => real_part := -12214; imag_part := -30407;
            when 1274 => real_part := -12261; imag_part := -30388;
            when 1275 => real_part := -12307; imag_part := -30369;
            when 1276 => real_part := -12354; imag_part := -30350;
            when 1277 => real_part := -12400; imag_part := -30331;
            when 1278 => real_part := -12447; imag_part := -30312;
            when 1279 => real_part := -12493; imag_part := -30293;
            when 1280 => real_part := -12540; imag_part := -30274;
            when 1281 => real_part := -12586; imag_part := -30254;
            when 1282 => real_part := -12633; imag_part := -30235;
            when 1283 => real_part := -12679; imag_part := -30216;
            when 1284 => real_part := -12725; imag_part := -30196;
            when 1285 => real_part := -12772; imag_part := -30177;
            when 1286 => real_part := -12818; imag_part := -30157;
            when 1287 => real_part := -12864; imag_part := -30137;
            when 1288 => real_part := -12910; imag_part := -30118;
            when 1289 => real_part := -12957; imag_part := -30098;
            when 1290 => real_part := -13003; imag_part := -30078;
            when 1291 => real_part := -13049; imag_part := -30058;
            when 1292 => real_part := -13095; imag_part := -30038;
            when 1293 => real_part := -13141; imag_part := -30018;
            when 1294 => real_part := -13187; imag_part := -29997;
            when 1295 => real_part := -13233; imag_part := -29977;
            when 1296 => real_part := -13279; imag_part := -29957;
            when 1297 => real_part := -13325; imag_part := -29936;
            when 1298 => real_part := -13371; imag_part := -29916;
            when 1299 => real_part := -13417; imag_part := -29895;
            when 1300 => real_part := -13463; imag_part := -29875;
            when 1301 => real_part := -13508; imag_part := -29854;
            when 1302 => real_part := -13554; imag_part := -29833;
            when 1303 => real_part := -13600; imag_part := -29813;
            when 1304 => real_part := -13646; imag_part := -29792;
            when 1305 => real_part := -13691; imag_part := -29771;
            when 1306 => real_part := -13737; imag_part := -29750;
            when 1307 => real_part := -13783; imag_part := -29729;
            when 1308 => real_part := -13828; imag_part := -29707;
            when 1309 => real_part := -13874; imag_part := -29686;
            when 1310 => real_part := -13919; imag_part := -29665;
            when 1311 => real_part := -13965; imag_part := -29643;
            when 1312 => real_part := -14010; imag_part := -29622;
            when 1313 => real_part := -14056; imag_part := -29600;
            when 1314 => real_part := -14101; imag_part := -29579;
            when 1315 => real_part := -14146; imag_part := -29557;
            when 1316 => real_part := -14192; imag_part := -29535;
            when 1317 => real_part := -14237; imag_part := -29514;
            when 1318 => real_part := -14282; imag_part := -29492;
            when 1319 => real_part := -14327; imag_part := -29470;
            when 1320 => real_part := -14373; imag_part := -29448;
            when 1321 => real_part := -14418; imag_part := -29426;
            when 1322 => real_part := -14463; imag_part := -29404;
            when 1323 => real_part := -14508; imag_part := -29381;
            when 1324 => real_part := -14553; imag_part := -29359;
            when 1325 => real_part := -14598; imag_part := -29337;
            when 1326 => real_part := -14643; imag_part := -29314;
            when 1327 => real_part := -14688; imag_part := -29292;
            when 1328 => real_part := -14733; imag_part := -29269;
            when 1329 => real_part := -14778; imag_part := -29247;
            when 1330 => real_part := -14823; imag_part := -29224;
            when 1331 => real_part := -14867; imag_part := -29201;
            when 1332 => real_part := -14912; imag_part := -29178;
            when 1333 => real_part := -14957; imag_part := -29155;
            when 1334 => real_part := -15002; imag_part := -29132;
            when 1335 => real_part := -15046; imag_part := -29109;
            when 1336 => real_part := -15091; imag_part := -29086;
            when 1337 => real_part := -15136; imag_part := -29063;
            when 1338 => real_part := -15180; imag_part := -29040;
            when 1339 => real_part := -15225; imag_part := -29016;
            when 1340 => real_part := -15269; imag_part := -28993;
            when 1341 => real_part := -15314; imag_part := -28970;
            when 1342 => real_part := -15358; imag_part := -28946;
            when 1343 => real_part := -15402; imag_part := -28922;
            when 1344 => real_part := -15447; imag_part := -28899;
            when 1345 => real_part := -15491; imag_part := -28875;
            when 1346 => real_part := -15535; imag_part := -28851;
            when 1347 => real_part := -15580; imag_part := -28827;
            when 1348 => real_part := -15624; imag_part := -28803;
            when 1349 => real_part := -15668; imag_part := -28779;
            when 1350 => real_part := -15712; imag_part := -28755;
            when 1351 => real_part := -15756; imag_part := -28731;
            when 1352 => real_part := -15800; imag_part := -28707;
            when 1353 => real_part := -15844; imag_part := -28683;
            when 1354 => real_part := -15888; imag_part := -28658;
            when 1355 => real_part := -15932; imag_part := -28634;
            when 1356 => real_part := -15976; imag_part := -28610;
            when 1357 => real_part := -16020; imag_part := -28585;
            when 1358 => real_part := -16064; imag_part := -28560;
            when 1359 => real_part := -16108; imag_part := -28536;
            when 1360 => real_part := -16151; imag_part := -28511;
            when 1361 => real_part := -16195; imag_part := -28486;
            when 1362 => real_part := -16239; imag_part := -28461;
            when 1363 => real_part := -16282; imag_part := -28436;
            when 1364 => real_part := -16326; imag_part := -28411;
            when 1365 => real_part := -16369; imag_part := -28386;
            when 1366 => real_part := -16413; imag_part := -28361;
            when 1367 => real_part := -16456; imag_part := -28336;
            when 1368 => real_part := -16500; imag_part := -28311;
            when 1369 => real_part := -16543; imag_part := -28285;
            when 1370 => real_part := -16587; imag_part := -28260;
            when 1371 => real_part := -16630; imag_part := -28234;
            when 1372 => real_part := -16673; imag_part := -28209;
            when 1373 => real_part := -16717; imag_part := -28183;
            when 1374 => real_part := -16760; imag_part := -28158;
            when 1375 => real_part := -16803; imag_part := -28132;
            when 1376 => real_part := -16846; imag_part := -28106;
            when 1377 => real_part := -16889; imag_part := -28080;
            when 1378 => real_part := -16932; imag_part := -28054;
            when 1379 => real_part := -16975; imag_part := -28028;
            when 1380 => real_part := -17018; imag_part := -28002;
            when 1381 => real_part := -17061; imag_part := -27976;
            when 1382 => real_part := -17104; imag_part := -27950;
            when 1383 => real_part := -17147; imag_part := -27924;
            when 1384 => real_part := -17190; imag_part := -27897;
            when 1385 => real_part := -17233; imag_part := -27871;
            when 1386 => real_part := -17275; imag_part := -27844;
            when 1387 => real_part := -17318; imag_part := -27818;
            when 1388 => real_part := -17361; imag_part := -27791;
            when 1389 => real_part := -17403; imag_part := -27765;
            when 1390 => real_part := -17446; imag_part := -27738;
            when 1391 => real_part := -17488; imag_part := -27711;
            when 1392 => real_part := -17531; imag_part := -27684;
            when 1393 => real_part := -17573; imag_part := -27657;
            when 1394 => real_part := -17616; imag_part := -27630;
            when 1395 => real_part := -17658; imag_part := -27603;
            when 1396 => real_part := -17700; imag_part := -27576;
            when 1397 => real_part := -17743; imag_part := -27549;
            when 1398 => real_part := -17785; imag_part := -27522;
            when 1399 => real_part := -17827; imag_part := -27494;
            when 1400 => real_part := -17869; imag_part := -27467;
            when 1401 => real_part := -17911; imag_part := -27440;
            when 1402 => real_part := -17953; imag_part := -27412;
            when 1403 => real_part := -17995; imag_part := -27384;
            when 1404 => real_part := -18037; imag_part := -27357;
            when 1405 => real_part := -18079; imag_part := -27329;
            when 1406 => real_part := -18121; imag_part := -27301;
            when 1407 => real_part := -18163; imag_part := -27273;
            when 1408 => real_part := -18205; imag_part := -27246;
            when 1409 => real_part := -18247; imag_part := -27218;
            when 1410 => real_part := -18288; imag_part := -27190;
            when 1411 => real_part := -18330; imag_part := -27162;
            when 1412 => real_part := -18372; imag_part := -27133;
            when 1413 => real_part := -18413; imag_part := -27105;
            when 1414 => real_part := -18455; imag_part := -27077;
            when 1415 => real_part := -18496; imag_part := -27049;
            when 1416 => real_part := -18538; imag_part := -27020;
            when 1417 => real_part := -18579; imag_part := -26992;
            when 1418 => real_part := -18621; imag_part := -26963;
            when 1419 => real_part := -18662; imag_part := -26935;
            when 1420 => real_part := -18703; imag_part := -26906;
            when 1421 => real_part := -18745; imag_part := -26877;
            when 1422 => real_part := -18786; imag_part := -26848;
            when 1423 => real_part := -18827; imag_part := -26820;
            when 1424 => real_part := -18868; imag_part := -26791;
            when 1425 => real_part := -18909; imag_part := -26762;
            when 1426 => real_part := -18950; imag_part := -26733;
            when 1427 => real_part := -18991; imag_part := -26704;
            when 1428 => real_part := -19032; imag_part := -26674;
            when 1429 => real_part := -19073; imag_part := -26645;
            when 1430 => real_part := -19114; imag_part := -26616;
            when 1431 => real_part := -19155; imag_part := -26586;
            when 1432 => real_part := -19195; imag_part := -26557;
            when 1433 => real_part := -19236; imag_part := -26528;
            when 1434 => real_part := -19277; imag_part := -26498;
            when 1435 => real_part := -19317; imag_part := -26468;
            when 1436 => real_part := -19358; imag_part := -26439;
            when 1437 => real_part := -19399; imag_part := -26409;
            when 1438 => real_part := -19439; imag_part := -26379;
            when 1439 => real_part := -19479; imag_part := -26349;
            when 1440 => real_part := -19520; imag_part := -26320;
            when 1441 => real_part := -19560; imag_part := -26290;
            when 1442 => real_part := -19601; imag_part := -26259;
            when 1443 => real_part := -19641; imag_part := -26229;
            when 1444 => real_part := -19681; imag_part := -26199;
            when 1445 => real_part := -19721; imag_part := -26169;
            when 1446 => real_part := -19761; imag_part := -26139;
            when 1447 => real_part := -19801; imag_part := -26108;
            when 1448 => real_part := -19841; imag_part := -26078;
            when 1449 => real_part := -19881; imag_part := -26048;
            when 1450 => real_part := -19921; imag_part := -26017;
            when 1451 => real_part := -19961; imag_part := -25986;
            when 1452 => real_part := -20001; imag_part := -25956;
            when 1453 => real_part := -20041; imag_part := -25925;
            when 1454 => real_part := -20081; imag_part := -25894;
            when 1455 => real_part := -20120; imag_part := -25863;
            when 1456 => real_part := -20160; imag_part := -25833;
            when 1457 => real_part := -20200; imag_part := -25802;
            when 1458 => real_part := -20239; imag_part := -25771;
            when 1459 => real_part := -20279; imag_part := -25739;
            when 1460 => real_part := -20318; imag_part := -25708;
            when 1461 => real_part := -20357; imag_part := -25677;
            when 1462 => real_part := -20397; imag_part := -25646;
            when 1463 => real_part := -20436; imag_part := -25615;
            when 1464 => real_part := -20475; imag_part := -25583;
            when 1465 => real_part := -20515; imag_part := -25552;
            when 1466 => real_part := -20554; imag_part := -25520;
            when 1467 => real_part := -20593; imag_part := -25489;
            when 1468 => real_part := -20632; imag_part := -25457;
            when 1469 => real_part := -20671; imag_part := -25425;
            when 1470 => real_part := -20710; imag_part := -25394;
            when 1471 => real_part := -20749; imag_part := -25362;
            when 1472 => real_part := -20788; imag_part := -25330;
            when 1473 => real_part := -20827; imag_part := -25298;
            when 1474 => real_part := -20865; imag_part := -25266;
            when 1475 => real_part := -20904; imag_part := -25234;
            when 1476 => real_part := -20943; imag_part := -25202;
            when 1477 => real_part := -20981; imag_part := -25170;
            when 1478 => real_part := -21020; imag_part := -25138;
            when 1479 => real_part := -21059; imag_part := -25105;
            when 1480 => real_part := -21097; imag_part := -25073;
            when 1481 => real_part := -21136; imag_part := -25041;
            when 1482 => real_part := -21174; imag_part := -25008;
            when 1483 => real_part := -21212; imag_part := -24976;
            when 1484 => real_part := -21251; imag_part := -24943;
            when 1485 => real_part := -21289; imag_part := -24910;
            when 1486 => real_part := -21327; imag_part := -24878;
            when 1487 => real_part := -21365; imag_part := -24845;
            when 1488 => real_part := -21403; imag_part := -24812;
            when 1489 => real_part := -21441; imag_part := -24779;
            when 1490 => real_part := -21479; imag_part := -24746;
            when 1491 => real_part := -21517; imag_part := -24713;
            when 1492 => real_part := -21555; imag_part := -24680;
            when 1493 => real_part := -21593; imag_part := -24647;
            when 1494 => real_part := -21631; imag_part := -24614;
            when 1495 => real_part := -21668; imag_part := -24581;
            when 1496 => real_part := -21706; imag_part := -24548;
            when 1497 => real_part := -21744; imag_part := -24514;
            when 1498 => real_part := -21781; imag_part := -24481;
            when 1499 => real_part := -21819; imag_part := -24448;
            when 1500 => real_part := -21856; imag_part := -24414;
            when 1501 => real_part := -21894; imag_part := -24380;
            when 1502 => real_part := -21931; imag_part := -24347;
            when 1503 => real_part := -21968; imag_part := -24313;
            when 1504 => real_part := -22006; imag_part := -24279;
            when 1505 => real_part := -22043; imag_part := -24246;
            when 1506 => real_part := -22080; imag_part := -24212;
            when 1507 => real_part := -22117; imag_part := -24178;
            when 1508 => real_part := -22154; imag_part := -24144;
            when 1509 => real_part := -22191; imag_part := -24110;
            when 1510 => real_part := -22228; imag_part := -24076;
            when 1511 => real_part := -22265; imag_part := -24042;
            when 1512 => real_part := -22302; imag_part := -24008;
            when 1513 => real_part := -22339; imag_part := -23973;
            when 1514 => real_part := -22375; imag_part := -23939;
            when 1515 => real_part := -22412; imag_part := -23905;
            when 1516 => real_part := -22449; imag_part := -23870;
            when 1517 => real_part := -22485; imag_part := -23836;
            when 1518 => real_part := -22522; imag_part := -23801;
            when 1519 => real_part := -22558; imag_part := -23767;
            when 1520 => real_part := -22595; imag_part := -23732;
            when 1521 => real_part := -22631; imag_part := -23697;
            when 1522 => real_part := -22668; imag_part := -23663;
            when 1523 => real_part := -22704; imag_part := -23628;
            when 1524 => real_part := -22740; imag_part := -23593;
            when 1525 => real_part := -22776; imag_part := -23558;
            when 1526 => real_part := -22812; imag_part := -23523;
            when 1527 => real_part := -22848; imag_part := -23488;
            when 1528 => real_part := -22884; imag_part := -23453;
            when 1529 => real_part := -22920; imag_part := -23418;
            when 1530 => real_part := -22956; imag_part := -23383;
            when 1531 => real_part := -22992; imag_part := -23348;
            when 1532 => real_part := -23028; imag_part := -23312;
            when 1533 => real_part := -23064; imag_part := -23277;
            when 1534 => real_part := -23099; imag_part := -23241;
            when 1535 => real_part := -23135; imag_part := -23206;
            when 1536 => real_part := -23170; imag_part := -23170;
            when 1537 => real_part := -23206; imag_part := -23135;
            when 1538 => real_part := -23241; imag_part := -23099;
            when 1539 => real_part := -23277; imag_part := -23064;
            when 1540 => real_part := -23312; imag_part := -23028;
            when 1541 => real_part := -23348; imag_part := -22992;
            when 1542 => real_part := -23383; imag_part := -22956;
            when 1543 => real_part := -23418; imag_part := -22920;
            when 1544 => real_part := -23453; imag_part := -22884;
            when 1545 => real_part := -23488; imag_part := -22848;
            when 1546 => real_part := -23523; imag_part := -22812;
            when 1547 => real_part := -23558; imag_part := -22776;
            when 1548 => real_part := -23593; imag_part := -22740;
            when 1549 => real_part := -23628; imag_part := -22704;
            when 1550 => real_part := -23663; imag_part := -22668;
            when 1551 => real_part := -23697; imag_part := -22631;
            when 1552 => real_part := -23732; imag_part := -22595;
            when 1553 => real_part := -23767; imag_part := -22558;
            when 1554 => real_part := -23801; imag_part := -22522;
            when 1555 => real_part := -23836; imag_part := -22485;
            when 1556 => real_part := -23870; imag_part := -22449;
            when 1557 => real_part := -23905; imag_part := -22412;
            when 1558 => real_part := -23939; imag_part := -22375;
            when 1559 => real_part := -23973; imag_part := -22339;
            when 1560 => real_part := -24008; imag_part := -22302;
            when 1561 => real_part := -24042; imag_part := -22265;
            when 1562 => real_part := -24076; imag_part := -22228;
            when 1563 => real_part := -24110; imag_part := -22191;
            when 1564 => real_part := -24144; imag_part := -22154;
            when 1565 => real_part := -24178; imag_part := -22117;
            when 1566 => real_part := -24212; imag_part := -22080;
            when 1567 => real_part := -24246; imag_part := -22043;
            when 1568 => real_part := -24279; imag_part := -22006;
            when 1569 => real_part := -24313; imag_part := -21968;
            when 1570 => real_part := -24347; imag_part := -21931;
            when 1571 => real_part := -24380; imag_part := -21894;
            when 1572 => real_part := -24414; imag_part := -21856;
            when 1573 => real_part := -24448; imag_part := -21819;
            when 1574 => real_part := -24481; imag_part := -21781;
            when 1575 => real_part := -24514; imag_part := -21744;
            when 1576 => real_part := -24548; imag_part := -21706;
            when 1577 => real_part := -24581; imag_part := -21668;
            when 1578 => real_part := -24614; imag_part := -21631;
            when 1579 => real_part := -24647; imag_part := -21593;
            when 1580 => real_part := -24680; imag_part := -21555;
            when 1581 => real_part := -24713; imag_part := -21517;
            when 1582 => real_part := -24746; imag_part := -21479;
            when 1583 => real_part := -24779; imag_part := -21441;
            when 1584 => real_part := -24812; imag_part := -21403;
            when 1585 => real_part := -24845; imag_part := -21365;
            when 1586 => real_part := -24878; imag_part := -21327;
            when 1587 => real_part := -24910; imag_part := -21289;
            when 1588 => real_part := -24943; imag_part := -21251;
            when 1589 => real_part := -24976; imag_part := -21212;
            when 1590 => real_part := -25008; imag_part := -21174;
            when 1591 => real_part := -25041; imag_part := -21136;
            when 1592 => real_part := -25073; imag_part := -21097;
            when 1593 => real_part := -25105; imag_part := -21059;
            when 1594 => real_part := -25138; imag_part := -21020;
            when 1595 => real_part := -25170; imag_part := -20981;
            when 1596 => real_part := -25202; imag_part := -20943;
            when 1597 => real_part := -25234; imag_part := -20904;
            when 1598 => real_part := -25266; imag_part := -20865;
            when 1599 => real_part := -25298; imag_part := -20827;
            when 1600 => real_part := -25330; imag_part := -20788;
            when 1601 => real_part := -25362; imag_part := -20749;
            when 1602 => real_part := -25394; imag_part := -20710;
            when 1603 => real_part := -25425; imag_part := -20671;
            when 1604 => real_part := -25457; imag_part := -20632;
            when 1605 => real_part := -25489; imag_part := -20593;
            when 1606 => real_part := -25520; imag_part := -20554;
            when 1607 => real_part := -25552; imag_part := -20515;
            when 1608 => real_part := -25583; imag_part := -20475;
            when 1609 => real_part := -25615; imag_part := -20436;
            when 1610 => real_part := -25646; imag_part := -20397;
            when 1611 => real_part := -25677; imag_part := -20357;
            when 1612 => real_part := -25708; imag_part := -20318;
            when 1613 => real_part := -25739; imag_part := -20279;
            when 1614 => real_part := -25771; imag_part := -20239;
            when 1615 => real_part := -25802; imag_part := -20200;
            when 1616 => real_part := -25833; imag_part := -20160;
            when 1617 => real_part := -25863; imag_part := -20120;
            when 1618 => real_part := -25894; imag_part := -20081;
            when 1619 => real_part := -25925; imag_part := -20041;
            when 1620 => real_part := -25956; imag_part := -20001;
            when 1621 => real_part := -25986; imag_part := -19961;
            when 1622 => real_part := -26017; imag_part := -19921;
            when 1623 => real_part := -26048; imag_part := -19881;
            when 1624 => real_part := -26078; imag_part := -19841;
            when 1625 => real_part := -26108; imag_part := -19801;
            when 1626 => real_part := -26139; imag_part := -19761;
            when 1627 => real_part := -26169; imag_part := -19721;
            when 1628 => real_part := -26199; imag_part := -19681;
            when 1629 => real_part := -26229; imag_part := -19641;
            when 1630 => real_part := -26259; imag_part := -19601;
            when 1631 => real_part := -26290; imag_part := -19560;
            when 1632 => real_part := -26320; imag_part := -19520;
            when 1633 => real_part := -26349; imag_part := -19479;
            when 1634 => real_part := -26379; imag_part := -19439;
            when 1635 => real_part := -26409; imag_part := -19399;
            when 1636 => real_part := -26439; imag_part := -19358;
            when 1637 => real_part := -26468; imag_part := -19317;
            when 1638 => real_part := -26498; imag_part := -19277;
            when 1639 => real_part := -26528; imag_part := -19236;
            when 1640 => real_part := -26557; imag_part := -19195;
            when 1641 => real_part := -26586; imag_part := -19155;
            when 1642 => real_part := -26616; imag_part := -19114;
            when 1643 => real_part := -26645; imag_part := -19073;
            when 1644 => real_part := -26674; imag_part := -19032;
            when 1645 => real_part := -26704; imag_part := -18991;
            when 1646 => real_part := -26733; imag_part := -18950;
            when 1647 => real_part := -26762; imag_part := -18909;
            when 1648 => real_part := -26791; imag_part := -18868;
            when 1649 => real_part := -26820; imag_part := -18827;
            when 1650 => real_part := -26848; imag_part := -18786;
            when 1651 => real_part := -26877; imag_part := -18745;
            when 1652 => real_part := -26906; imag_part := -18703;
            when 1653 => real_part := -26935; imag_part := -18662;
            when 1654 => real_part := -26963; imag_part := -18621;
            when 1655 => real_part := -26992; imag_part := -18579;
            when 1656 => real_part := -27020; imag_part := -18538;
            when 1657 => real_part := -27049; imag_part := -18496;
            when 1658 => real_part := -27077; imag_part := -18455;
            when 1659 => real_part := -27105; imag_part := -18413;
            when 1660 => real_part := -27133; imag_part := -18372;
            when 1661 => real_part := -27162; imag_part := -18330;
            when 1662 => real_part := -27190; imag_part := -18288;
            when 1663 => real_part := -27218; imag_part := -18247;
            when 1664 => real_part := -27246; imag_part := -18205;
            when 1665 => real_part := -27273; imag_part := -18163;
            when 1666 => real_part := -27301; imag_part := -18121;
            when 1667 => real_part := -27329; imag_part := -18079;
            when 1668 => real_part := -27357; imag_part := -18037;
            when 1669 => real_part := -27384; imag_part := -17995;
            when 1670 => real_part := -27412; imag_part := -17953;
            when 1671 => real_part := -27440; imag_part := -17911;
            when 1672 => real_part := -27467; imag_part := -17869;
            when 1673 => real_part := -27494; imag_part := -17827;
            when 1674 => real_part := -27522; imag_part := -17785;
            when 1675 => real_part := -27549; imag_part := -17743;
            when 1676 => real_part := -27576; imag_part := -17700;
            when 1677 => real_part := -27603; imag_part := -17658;
            when 1678 => real_part := -27630; imag_part := -17616;
            when 1679 => real_part := -27657; imag_part := -17573;
            when 1680 => real_part := -27684; imag_part := -17531;
            when 1681 => real_part := -27711; imag_part := -17488;
            when 1682 => real_part := -27738; imag_part := -17446;
            when 1683 => real_part := -27765; imag_part := -17403;
            when 1684 => real_part := -27791; imag_part := -17361;
            when 1685 => real_part := -27818; imag_part := -17318;
            when 1686 => real_part := -27844; imag_part := -17275;
            when 1687 => real_part := -27871; imag_part := -17233;
            when 1688 => real_part := -27897; imag_part := -17190;
            when 1689 => real_part := -27924; imag_part := -17147;
            when 1690 => real_part := -27950; imag_part := -17104;
            when 1691 => real_part := -27976; imag_part := -17061;
            when 1692 => real_part := -28002; imag_part := -17018;
            when 1693 => real_part := -28028; imag_part := -16975;
            when 1694 => real_part := -28054; imag_part := -16932;
            when 1695 => real_part := -28080; imag_part := -16889;
            when 1696 => real_part := -28106; imag_part := -16846;
            when 1697 => real_part := -28132; imag_part := -16803;
            when 1698 => real_part := -28158; imag_part := -16760;
            when 1699 => real_part := -28183; imag_part := -16717;
            when 1700 => real_part := -28209; imag_part := -16673;
            when 1701 => real_part := -28234; imag_part := -16630;
            when 1702 => real_part := -28260; imag_part := -16587;
            when 1703 => real_part := -28285; imag_part := -16543;
            when 1704 => real_part := -28311; imag_part := -16500;
            when 1705 => real_part := -28336; imag_part := -16456;
            when 1706 => real_part := -28361; imag_part := -16413;
            when 1707 => real_part := -28386; imag_part := -16369;
            when 1708 => real_part := -28411; imag_part := -16326;
            when 1709 => real_part := -28436; imag_part := -16282;
            when 1710 => real_part := -28461; imag_part := -16239;
            when 1711 => real_part := -28486; imag_part := -16195;
            when 1712 => real_part := -28511; imag_part := -16151;
            when 1713 => real_part := -28536; imag_part := -16108;
            when 1714 => real_part := -28560; imag_part := -16064;
            when 1715 => real_part := -28585; imag_part := -16020;
            when 1716 => real_part := -28610; imag_part := -15976;
            when 1717 => real_part := -28634; imag_part := -15932;
            when 1718 => real_part := -28658; imag_part := -15888;
            when 1719 => real_part := -28683; imag_part := -15844;
            when 1720 => real_part := -28707; imag_part := -15800;
            when 1721 => real_part := -28731; imag_part := -15756;
            when 1722 => real_part := -28755; imag_part := -15712;
            when 1723 => real_part := -28779; imag_part := -15668;
            when 1724 => real_part := -28803; imag_part := -15624;
            when 1725 => real_part := -28827; imag_part := -15580;
            when 1726 => real_part := -28851; imag_part := -15535;
            when 1727 => real_part := -28875; imag_part := -15491;
            when 1728 => real_part := -28899; imag_part := -15447;
            when 1729 => real_part := -28922; imag_part := -15402;
            when 1730 => real_part := -28946; imag_part := -15358;
            when 1731 => real_part := -28970; imag_part := -15314;
            when 1732 => real_part := -28993; imag_part := -15269;
            when 1733 => real_part := -29016; imag_part := -15225;
            when 1734 => real_part := -29040; imag_part := -15180;
            when 1735 => real_part := -29063; imag_part := -15136;
            when 1736 => real_part := -29086; imag_part := -15091;
            when 1737 => real_part := -29109; imag_part := -15046;
            when 1738 => real_part := -29132; imag_part := -15002;
            when 1739 => real_part := -29155; imag_part := -14957;
            when 1740 => real_part := -29178; imag_part := -14912;
            when 1741 => real_part := -29201; imag_part := -14867;
            when 1742 => real_part := -29224; imag_part := -14823;
            when 1743 => real_part := -29247; imag_part := -14778;
            when 1744 => real_part := -29269; imag_part := -14733;
            when 1745 => real_part := -29292; imag_part := -14688;
            when 1746 => real_part := -29314; imag_part := -14643;
            when 1747 => real_part := -29337; imag_part := -14598;
            when 1748 => real_part := -29359; imag_part := -14553;
            when 1749 => real_part := -29381; imag_part := -14508;
            when 1750 => real_part := -29404; imag_part := -14463;
            when 1751 => real_part := -29426; imag_part := -14418;
            when 1752 => real_part := -29448; imag_part := -14373;
            when 1753 => real_part := -29470; imag_part := -14327;
            when 1754 => real_part := -29492; imag_part := -14282;
            when 1755 => real_part := -29514; imag_part := -14237;
            when 1756 => real_part := -29535; imag_part := -14192;
            when 1757 => real_part := -29557; imag_part := -14146;
            when 1758 => real_part := -29579; imag_part := -14101;
            when 1759 => real_part := -29600; imag_part := -14056;
            when 1760 => real_part := -29622; imag_part := -14010;
            when 1761 => real_part := -29643; imag_part := -13965;
            when 1762 => real_part := -29665; imag_part := -13919;
            when 1763 => real_part := -29686; imag_part := -13874;
            when 1764 => real_part := -29707; imag_part := -13828;
            when 1765 => real_part := -29729; imag_part := -13783;
            when 1766 => real_part := -29750; imag_part := -13737;
            when 1767 => real_part := -29771; imag_part := -13691;
            when 1768 => real_part := -29792; imag_part := -13646;
            when 1769 => real_part := -29813; imag_part := -13600;
            when 1770 => real_part := -29833; imag_part := -13554;
            when 1771 => real_part := -29854; imag_part := -13508;
            when 1772 => real_part := -29875; imag_part := -13463;
            when 1773 => real_part := -29895; imag_part := -13417;
            when 1774 => real_part := -29916; imag_part := -13371;
            when 1775 => real_part := -29936; imag_part := -13325;
            when 1776 => real_part := -29957; imag_part := -13279;
            when 1777 => real_part := -29977; imag_part := -13233;
            when 1778 => real_part := -29997; imag_part := -13187;
            when 1779 => real_part := -30018; imag_part := -13141;
            when 1780 => real_part := -30038; imag_part := -13095;
            when 1781 => real_part := -30058; imag_part := -13049;
            when 1782 => real_part := -30078; imag_part := -13003;
            when 1783 => real_part := -30098; imag_part := -12957;
            when 1784 => real_part := -30118; imag_part := -12910;
            when 1785 => real_part := -30137; imag_part := -12864;
            when 1786 => real_part := -30157; imag_part := -12818;
            when 1787 => real_part := -30177; imag_part := -12772;
            when 1788 => real_part := -30196; imag_part := -12725;
            when 1789 => real_part := -30216; imag_part := -12679;
            when 1790 => real_part := -30235; imag_part := -12633;
            when 1791 => real_part := -30254; imag_part := -12586;
            when 1792 => real_part := -30274; imag_part := -12540;
            when 1793 => real_part := -30293; imag_part := -12493;
            when 1794 => real_part := -30312; imag_part := -12447;
            when 1795 => real_part := -30331; imag_part := -12400;
            when 1796 => real_part := -30350; imag_part := -12354;
            when 1797 => real_part := -30369; imag_part := -12307;
            when 1798 => real_part := -30388; imag_part := -12261;
            when 1799 => real_part := -30407; imag_part := -12214;
            when 1800 => real_part := -30425; imag_part := -12167;
            when 1801 => real_part := -30444; imag_part := -12121;
            when 1802 => real_part := -30462; imag_part := -12074;
            when 1803 => real_part := -30481; imag_part := -12027;
            when 1804 => real_part := -30499; imag_part := -11980;
            when 1805 => real_part := -30518; imag_part := -11934;
            when 1806 => real_part := -30536; imag_part := -11887;
            when 1807 => real_part := -30554; imag_part := -11840;
            when 1808 => real_part := -30572; imag_part := -11793;
            when 1809 => real_part := -30590; imag_part := -11746;
            when 1810 => real_part := -30608; imag_part := -11699;
            when 1811 => real_part := -30626; imag_part := -11652;
            when 1812 => real_part := -30644; imag_part := -11605;
            when 1813 => real_part := -30662; imag_part := -11558;
            when 1814 => real_part := -30680; imag_part := -11511;
            when 1815 => real_part := -30697; imag_part := -11464;
            when 1816 => real_part := -30715; imag_part := -11417;
            when 1817 => real_part := -30732; imag_part := -11370;
            when 1818 => real_part := -30750; imag_part := -11323;
            when 1819 => real_part := -30767; imag_part := -11276;
            when 1820 => real_part := -30784; imag_part := -11228;
            when 1821 => real_part := -30801; imag_part := -11181;
            when 1822 => real_part := -30819; imag_part := -11134;
            when 1823 => real_part := -30836; imag_part := -11087;
            when 1824 => real_part := -30853; imag_part := -11039;
            when 1825 => real_part := -30869; imag_part := -10992;
            when 1826 => real_part := -30886; imag_part := -10945;
            when 1827 => real_part := -30903; imag_part := -10897;
            when 1828 => real_part := -30920; imag_part := -10850;
            when 1829 => real_part := -30936; imag_part := -10802;
            when 1830 => real_part := -30953; imag_part := -10755;
            when 1831 => real_part := -30969; imag_part := -10707;
            when 1832 => real_part := -30986; imag_part := -10660;
            when 1833 => real_part := -31002; imag_part := -10612;
            when 1834 => real_part := -31018; imag_part := -10565;
            when 1835 => real_part := -31034; imag_part := -10517;
            when 1836 => real_part := -31050; imag_part := -10469;
            when 1837 => real_part := -31067; imag_part := -10422;
            when 1838 => real_part := -31082; imag_part := -10374;
            when 1839 => real_part := -31098; imag_part := -10326;
            when 1840 => real_part := -31114; imag_part := -10279;
            when 1841 => real_part := -31130; imag_part := -10231;
            when 1842 => real_part := -31146; imag_part := -10183;
            when 1843 => real_part := -31161; imag_part := -10135;
            when 1844 => real_part := -31177; imag_part := -10088;
            when 1845 => real_part := -31192; imag_part := -10040;
            when 1846 => real_part := -31207; imag_part := -9992;
            when 1847 => real_part := -31223; imag_part := -9944;
            when 1848 => real_part := -31238; imag_part := -9896;
            when 1849 => real_part := -31253; imag_part := -9848;
            when 1850 => real_part := -31268; imag_part := -9800;
            when 1851 => real_part := -31283; imag_part := -9752;
            when 1852 => real_part := -31298; imag_part := -9704;
            when 1853 => real_part := -31313; imag_part := -9656;
            when 1854 => real_part := -31328; imag_part := -9608;
            when 1855 => real_part := -31342; imag_part := -9560;
            when 1856 => real_part := -31357; imag_part := -9512;
            when 1857 => real_part := -31372; imag_part := -9464;
            when 1858 => real_part := -31386; imag_part := -9416;
            when 1859 => real_part := -31400; imag_part := -9368;
            when 1860 => real_part := -31415; imag_part := -9319;
            when 1861 => real_part := -31429; imag_part := -9271;
            when 1862 => real_part := -31443; imag_part := -9223;
            when 1863 => real_part := -31457; imag_part := -9175;
            when 1864 => real_part := -31471; imag_part := -9127;
            when 1865 => real_part := -31485; imag_part := -9078;
            when 1866 => real_part := -31499; imag_part := -9030;
            when 1867 => real_part := -31513; imag_part := -8982;
            when 1868 => real_part := -31527; imag_part := -8933;
            when 1869 => real_part := -31540; imag_part := -8885;
            when 1870 => real_part := -31554; imag_part := -8836;
            when 1871 => real_part := -31568; imag_part := -8788;
            when 1872 => real_part := -31581; imag_part := -8740;
            when 1873 => real_part := -31594; imag_part := -8691;
            when 1874 => real_part := -31608; imag_part := -8643;
            when 1875 => real_part := -31621; imag_part := -8594;
            when 1876 => real_part := -31634; imag_part := -8546;
            when 1877 => real_part := -31647; imag_part := -8497;
            when 1878 => real_part := -31660; imag_part := -8449;
            when 1879 => real_part := -31673; imag_part := -8400;
            when 1880 => real_part := -31686; imag_part := -8351;
            when 1881 => real_part := -31699; imag_part := -8303;
            when 1882 => real_part := -31711; imag_part := -8254;
            when 1883 => real_part := -31724; imag_part := -8206;
            when 1884 => real_part := -31737; imag_part := -8157;
            when 1885 => real_part := -31749; imag_part := -8108;
            when 1886 => real_part := -31761; imag_part := -8059;
            when 1887 => real_part := -31774; imag_part := -8011;
            when 1888 => real_part := -31786; imag_part := -7962;
            when 1889 => real_part := -31798; imag_part := -7913;
            when 1890 => real_part := -31810; imag_part := -7864;
            when 1891 => real_part := -31822; imag_part := -7816;
            when 1892 => real_part := -31834; imag_part := -7767;
            when 1893 => real_part := -31846; imag_part := -7718;
            when 1894 => real_part := -31858; imag_part := -7669;
            when 1895 => real_part := -31870; imag_part := -7620;
            when 1896 => real_part := -31881; imag_part := -7571;
            when 1897 => real_part := -31893; imag_part := -7522;
            when 1898 => real_part := -31904; imag_part := -7473;
            when 1899 => real_part := -31916; imag_part := -7425;
            when 1900 => real_part := -31927; imag_part := -7376;
            when 1901 => real_part := -31938; imag_part := -7327;
            when 1902 => real_part := -31950; imag_part := -7278;
            when 1903 => real_part := -31961; imag_part := -7229;
            when 1904 => real_part := -31972; imag_part := -7180;
            when 1905 => real_part := -31983; imag_part := -7130;
            when 1906 => real_part := -31994; imag_part := -7081;
            when 1907 => real_part := -32005; imag_part := -7032;
            when 1908 => real_part := -32015; imag_part := -6983;
            when 1909 => real_part := -32026; imag_part := -6934;
            when 1910 => real_part := -32037; imag_part := -6885;
            when 1911 => real_part := -32047; imag_part := -6836;
            when 1912 => real_part := -32058; imag_part := -6787;
            when 1913 => real_part := -32068; imag_part := -6737;
            when 1914 => real_part := -32078; imag_part := -6688;
            when 1915 => real_part := -32088; imag_part := -6639;
            when 1916 => real_part := -32099; imag_part := -6590;
            when 1917 => real_part := -32109; imag_part := -6541;
            when 1918 => real_part := -32119; imag_part := -6491;
            when 1919 => real_part := -32129; imag_part := -6442;
            when 1920 => real_part := -32138; imag_part := -6393;
            when 1921 => real_part := -32148; imag_part := -6343;
            when 1922 => real_part := -32158; imag_part := -6294;
            when 1923 => real_part := -32167; imag_part := -6245;
            when 1924 => real_part := -32177; imag_part := -6195;
            when 1925 => real_part := -32186; imag_part := -6146;
            when 1926 => real_part := -32196; imag_part := -6097;
            when 1927 => real_part := -32205; imag_part := -6047;
            when 1928 => real_part := -32214; imag_part := -5998;
            when 1929 => real_part := -32224; imag_part := -5948;
            when 1930 => real_part := -32233; imag_part := -5899;
            when 1931 => real_part := -32242; imag_part := -5850;
            when 1932 => real_part := -32251; imag_part := -5800;
            when 1933 => real_part := -32259; imag_part := -5751;
            when 1934 => real_part := -32268; imag_part := -5701;
            when 1935 => real_part := -32277; imag_part := -5652;
            when 1936 => real_part := -32286; imag_part := -5602;
            when 1937 => real_part := -32294; imag_part := -5553;
            when 1938 => real_part := -32303; imag_part := -5503;
            when 1939 => real_part := -32311; imag_part := -5453;
            when 1940 => real_part := -32319; imag_part := -5404;
            when 1941 => real_part := -32328; imag_part := -5354;
            when 1942 => real_part := -32336; imag_part := -5305;
            when 1943 => real_part := -32344; imag_part := -5255;
            when 1944 => real_part := -32352; imag_part := -5205;
            when 1945 => real_part := -32360; imag_part := -5156;
            when 1946 => real_part := -32368; imag_part := -5106;
            when 1947 => real_part := -32376; imag_part := -5057;
            when 1948 => real_part := -32383; imag_part := -5007;
            when 1949 => real_part := -32391; imag_part := -4957;
            when 1950 => real_part := -32398; imag_part := -4907;
            when 1951 => real_part := -32406; imag_part := -4858;
            when 1952 => real_part := -32413; imag_part := -4808;
            when 1953 => real_part := -32421; imag_part := -4758;
            when 1954 => real_part := -32428; imag_part := -4709;
            when 1955 => real_part := -32435; imag_part := -4659;
            when 1956 => real_part := -32442; imag_part := -4609;
            when 1957 => real_part := -32449; imag_part := -4559;
            when 1958 => real_part := -32456; imag_part := -4510;
            when 1959 => real_part := -32463; imag_part := -4460;
            when 1960 => real_part := -32470; imag_part := -4410;
            when 1961 => real_part := -32477; imag_part := -4360;
            when 1962 => real_part := -32483; imag_part := -4310;
            when 1963 => real_part := -32490; imag_part := -4260;
            when 1964 => real_part := -32496; imag_part := -4211;
            when 1965 => real_part := -32503; imag_part := -4161;
            when 1966 => real_part := -32509; imag_part := -4111;
            when 1967 => real_part := -32515; imag_part := -4061;
            when 1968 => real_part := -32522; imag_part := -4011;
            when 1969 => real_part := -32528; imag_part := -3961;
            when 1970 => real_part := -32534; imag_part := -3911;
            when 1971 => real_part := -32540; imag_part := -3861;
            when 1972 => real_part := -32546; imag_part := -3812;
            when 1973 => real_part := -32551; imag_part := -3762;
            when 1974 => real_part := -32557; imag_part := -3712;
            when 1975 => real_part := -32563; imag_part := -3662;
            when 1976 => real_part := -32568; imag_part := -3612;
            when 1977 => real_part := -32574; imag_part := -3562;
            when 1978 => real_part := -32579; imag_part := -3512;
            when 1979 => real_part := -32585; imag_part := -3462;
            when 1980 => real_part := -32590; imag_part := -3412;
            when 1981 => real_part := -32595; imag_part := -3362;
            when 1982 => real_part := -32600; imag_part := -3312;
            when 1983 => real_part := -32605; imag_part := -3262;
            when 1984 => real_part := -32610; imag_part := -3212;
            when 1985 => real_part := -32615; imag_part := -3162;
            when 1986 => real_part := -32620; imag_part := -3112;
            when 1987 => real_part := -32625; imag_part := -3062;
            when 1988 => real_part := -32629; imag_part := -3012;
            when 1989 => real_part := -32634; imag_part := -2962;
            when 1990 => real_part := -32638; imag_part := -2912;
            when 1991 => real_part := -32643; imag_part := -2861;
            when 1992 => real_part := -32647; imag_part := -2811;
            when 1993 => real_part := -32651; imag_part := -2761;
            when 1994 => real_part := -32656; imag_part := -2711;
            when 1995 => real_part := -32660; imag_part := -2661;
            when 1996 => real_part := -32664; imag_part := -2611;
            when 1997 => real_part := -32668; imag_part := -2561;
            when 1998 => real_part := -32672; imag_part := -2511;
            when 1999 => real_part := -32675; imag_part := -2461;
            when 2000 => real_part := -32679; imag_part := -2411;
            when 2001 => real_part := -32683; imag_part := -2360;
            when 2002 => real_part := -32686; imag_part := -2310;
            when 2003 => real_part := -32690; imag_part := -2260;
            when 2004 => real_part := -32693; imag_part := -2210;
            when 2005 => real_part := -32697; imag_part := -2160;
            when 2006 => real_part := -32700; imag_part := -2110;
            when 2007 => real_part := -32703; imag_part := -2060;
            when 2008 => real_part := -32706; imag_part := -2009;
            when 2009 => real_part := -32709; imag_part := -1959;
            when 2010 => real_part := -32712; imag_part := -1909;
            when 2011 => real_part := -32715; imag_part := -1859;
            when 2012 => real_part := -32718; imag_part := -1809;
            when 2013 => real_part := -32721; imag_part := -1758;
            when 2014 => real_part := -32723; imag_part := -1708;
            when 2015 => real_part := -32726; imag_part := -1658;
            when 2016 => real_part := -32729; imag_part := -1608;
            when 2017 => real_part := -32731; imag_part := -1558;
            when 2018 => real_part := -32733; imag_part := -1507;
            when 2019 => real_part := -32736; imag_part := -1457;
            when 2020 => real_part := -32738; imag_part := -1407;
            when 2021 => real_part := -32740; imag_part := -1357;
            when 2022 => real_part := -32742; imag_part := -1307;
            when 2023 => real_part := -32744; imag_part := -1256;
            when 2024 => real_part := -32746; imag_part := -1206;
            when 2025 => real_part := -32748; imag_part := -1156;
            when 2026 => real_part := -32749; imag_part := -1106;
            when 2027 => real_part := -32751; imag_part := -1055;
            when 2028 => real_part := -32753; imag_part := -1005;
            when 2029 => real_part := -32754; imag_part := -955;
            when 2030 => real_part := -32756; imag_part := -905;
            when 2031 => real_part := -32757; imag_part := -854;
            when 2032 => real_part := -32758; imag_part := -804;
            when 2033 => real_part := -32759; imag_part := -754;
            when 2034 => real_part := -32760; imag_part := -704;
            when 2035 => real_part := -32761; imag_part := -653;
            when 2036 => real_part := -32762; imag_part := -603;
            when 2037 => real_part := -32763; imag_part := -553;
            when 2038 => real_part := -32764; imag_part := -503;
            when 2039 => real_part := -32765; imag_part := -452;
            when 2040 => real_part := -32766; imag_part := -402;
            when 2041 => real_part := -32766; imag_part := -352;
            when 2042 => real_part := -32767; imag_part := -302;
            when 2043 => real_part := -32767; imag_part := -251;
            when 2044 => real_part := -32767; imag_part := -201;
            when 2045 => real_part := -32768; imag_part := -151;
            when 2046 => real_part := -32768; imag_part := -101;
            when 2047 => real_part := -32768; imag_part := -50;
            when others => real_part := 0; imag_part := 0;
        end case;
        if inverse then
            if imag_part = -32768 then imag_part := 32767;
            else imag_part := -imag_part; end if;
        end if;
        return pack_complex(to_signed(real_part, 16), to_signed(imag_part, 16));
    end;

    signal sample_memory : sample_memory_t := (others => (others => '0'));
    attribute ram_style : string;
    attribute ram_style of sample_memory : signal is "block";

    signal phase : phase_t := load_frame;
    signal frame_active : boolean := false;
    signal load_count : natural range 0 to SAMPLES - 1 := 0;
    signal stage_index : natural range 0 to STAGES - 1 := 0;
    signal group_base : natural range 0 to SAMPLES - 1 := 0;
    signal group_size : natural range 2 to SAMPLES := 2;
    signal half_size : natural range 1 to SAMPLES / 2 := 1;
    signal position : natural range 0 to SAMPLES / 2 - 1 := 0;
    signal twiddle_stride : natural range 1 to SAMPLES / 2 := SAMPLES / 2;
    signal twiddle_index : natural range 0 to SAMPLES / 2 - 1 := 0;
    signal address_a, address_b : natural range 0 to SAMPLES - 1 := 0;
    signal operand_a, operand_b, operand_twiddle : complex_word_t :=
        (others => '0');
    signal emit_index : natural range 0 to SAMPLES - 1 := 0;
    signal output_word : complex_word_t := (others => '0');
    signal frame_length_error : boolean := false;
begin
    ctor_inputready <= ctor_lvt_context_in.rst = '0' and phase = load_frame;
    ctor_outputvalid <= ctor_lvt_context_in.rst = '0' and phase = emit_hold;
    ctor_outputreal <= output_word(31 downto 16);
    ctor_outputimag <= output_word(15 downto 0);
    ctor_outputfirst <= emit_index = 0;
    ctor_outputlast <= emit_index = SAMPLES - 1;
    ctor_framelengtherror <= frame_length_error;

    process (ctor_lvt_context_in.clk)
        variable logical_index, memory_address : natural;
        variable next_address_a, next_address_b : natural;
        variable master_twiddle_index : natural;
        variable ar, ai, br, bi, wr, wi : q15_t;
        variable product_rr, product_ii, product_ri, product_ir : product_t;
        variable twiddle_real, twiddle_imag : complex_product_t;
        variable aligned_real, aligned_imag : complex_product_t;
        variable sum_real, sum_imag, difference_real, difference_imag : butterfly_t;
        variable result_a_real, result_a_imag : q15_t;
        variable result_b_real, result_b_imag : q15_t;
        variable selected_shift : natural range 0 to 1;
    begin
        if rising_edge(ctor_lvt_context_in.clk) then
            if ctor_lvt_context_in.rst = '1' then
                phase <= load_frame;
                frame_active <= false;
                load_count <= 0;
                stage_index <= 0;
                group_base <= 0;
                group_size <= 2;
                half_size <= 1;
                position <= 0;
                twiddle_stride <= SAMPLES / 2;
                twiddle_index <= 0;
                emit_index <= 0;
                output_word <= (others => '0');
                frame_length_error <= false;
            else
                assert supported_size(SAMPLES)
                    report "sequential FFT length must be in 8..4096" severity failure;
                assert 2 ** STAGES = SAMPLES
                    report "sequential FFT length must be a power of two" severity failure;
                assert to_integer(ctor_stageshiftmask) >= -1 and
                    to_integer(ctor_stageshiftmask) <= 4095
                    report "invalid FFT stage shift mask" severity failure;

                frame_length_error <= false;

                case phase is
                    when load_frame =>
                        if ctor_inputvalid then
                            if ctor_inputfirst then
                                if frame_active then frame_length_error <= true; end if;
                                logical_index := 0;
                                if ctor_inputbitreversed then
                                    memory_address := logical_index;
                                else
                                    memory_address := reverse_bits(logical_index, STAGES);
                                end if;
                                sample_memory(memory_address) <= pack_complex(
                                    signed(ctor_inputreal), signed(ctor_inputimag));
                                load_count <= 1;
                                frame_active <= true;
                                if ctor_inputlast then
                                    frame_length_error <= true;
                                    frame_active <= false;
                                    load_count <= 0;
                                end if;
                            elsif frame_active then
                                logical_index := load_count;
                                if ctor_inputbitreversed then
                                    memory_address := logical_index;
                                else
                                    memory_address := reverse_bits(logical_index, STAGES);
                                end if;
                                sample_memory(memory_address) <= pack_complex(
                                    signed(ctor_inputreal), signed(ctor_inputimag));

                                if ctor_inputlast then
                                    if load_count = SAMPLES - 1 then
                                        frame_active <= false;
                                        load_count <= 0;
                                        stage_index <= 0;
                                        group_base <= 0;
                                        group_size <= 2;
                                        half_size <= 1;
                                        position <= 0;
                                        twiddle_stride <= SAMPLES / 2;
                                        twiddle_index <= 0;
                                        phase <= compute_read;
                                    else
                                        frame_length_error <= true;
                                        frame_active <= false;
                                        load_count <= 0;
                                    end if;
                                elsif load_count = SAMPLES - 1 then
                                    frame_length_error <= true;
                                    frame_active <= false;
                                    load_count <= 0;
                                else
                                    load_count <= load_count + 1;
                                end if;
                            else
                                frame_length_error <= true;
                            end if;
                        end if;

                    when compute_read =>
                        next_address_a := group_base + position;
                        next_address_b := next_address_a + half_size;
                        address_a <= next_address_a;
                        address_b <= next_address_b;
                        operand_a <= sample_memory(next_address_a);
                        operand_b <= sample_memory(next_address_b);
                        master_twiddle_index := twiddle_index
                            * (MASTER_SAMPLES / SAMPLES);
                        operand_twiddle <= twiddle(master_twiddle_index,
                            ctor_inverse);
                        phase <= compute_write;

                    when compute_write =>
                        ar := signed(operand_a(31 downto 16));
                        ai := signed(operand_a(15 downto 0));
                        br := signed(operand_b(31 downto 16));
                        bi := signed(operand_b(15 downto 0));
                        wr := signed(operand_twiddle(31 downto 16));
                        wi := signed(operand_twiddle(15 downto 0));
                        product_rr := br * wr;
                        product_ii := bi * wi;
                        product_ri := br * wi;
                        product_ir := bi * wr;
                        twiddle_real := resize(product_rr, 33)
                            - resize(product_ii, 33);
                        twiddle_imag := resize(product_ri, 33)
                            + resize(product_ir, 33);
                        aligned_real := shift_left(resize(ar, 33), 15);
                        aligned_imag := shift_left(resize(ai, 33), 15);
                        sum_real := resize(aligned_real, 34)
                            + resize(twiddle_real, 34);
                        sum_imag := resize(aligned_imag, 34)
                            + resize(twiddle_imag, 34);
                        difference_real := resize(aligned_real, 34)
                            - resize(twiddle_real, 34);
                        difference_imag := resize(aligned_imag, 34)
                            - resize(twiddle_imag, 34);
                        if ctor_stageshiftmask(stage_index) = '1' then
                            selected_shift := 1;
                        else
                            selected_shift := 0;
                        end if;
                        result_a_real := quantize_q15(sum_real, selected_shift);
                        result_a_imag := quantize_q15(sum_imag, selected_shift);
                        result_b_real := quantize_q15(difference_real, selected_shift);
                        result_b_imag := quantize_q15(difference_imag, selected_shift);
                        sample_memory(address_a) <= pack_complex(
                            result_a_real, result_a_imag);
                        sample_memory(address_b) <= pack_complex(
                            result_b_real, result_b_imag);

                        if position + 1 < half_size then
                            position <= position + 1;
                            twiddle_index <= twiddle_index + twiddle_stride;
                            phase <= compute_read;
                        elsif group_base + group_size < SAMPLES then
                            group_base <= group_base + group_size;
                            position <= 0;
                            twiddle_index <= 0;
                            phase <= compute_read;
                        elsif stage_index + 1 < STAGES then
                            stage_index <= stage_index + 1;
                            group_base <= 0;
                            group_size <= group_size * 2;
                            half_size <= half_size * 2;
                            position <= 0;
                            twiddle_stride <= twiddle_stride / 2;
                            twiddle_index <= 0;
                            phase <= compute_read;
                        else
                            emit_index <= 0;
                            phase <= emit_read;
                        end if;

                    when emit_read =>
                        if ctor_outputbitreversed then
                            memory_address := reverse_bits(emit_index, STAGES);
                        else
                            memory_address := emit_index;
                        end if;
                        output_word <= sample_memory(memory_address);
                        phase <= emit_hold;

                    when emit_hold =>
                        if ctor_outputready then
                            if emit_index = SAMPLES - 1 then
                                emit_index <= 0;
                                phase <= load_frame;
                            else
                                emit_index <= emit_index + 1;
                                phase <= emit_read;
                            end if;
                        end if;
                end case;
            end if;
        end if;
    end process;
end;