Path: blob/main/scripts/classical_modular_forms/utils.psql
1448 views
CREATE OR REPLACE FUNCTION to_base26(IN n integer) RETURNS varchar AS $$1DECLARE2s varchar;3m integer;4BEGIN5m := n;6IF m < 0 THEN7s := 'NULL';8ELSIF m = 0 THEN9s := 'a';10ELSE11s := '';12WHILE m != 0 LOOP13s := chr(m%26+97) || s;14m := m/26;15END LOOP;16END IF;1718RETURN s;19END;20$$ LANGUAGE plpgsql;2122CREATE OR REPLACE FUNCTION from_base26(IN s varchar) RETURNS integer AS $$23DECLARE24k integer[];25m integer := 0;26p integer := 1;27BEGIN28k := array(SELECT ascii(unnest(regexp_split_to_array(reverse(s),''))) - 97);29FOR l in 1 .. array_length(k,1) LOOP30m := m + p*k[l];31p := p*26;32END LOOP;33return m;34END;35$$ LANGUAGE plpgsql;3637CREATE OR REPLACE FUNCTION from_newform_label_to_hecke_orbit_code(IN s varchar) RETURNS bigint AS $$38DECLARE39v text[];40BEGIN41v := string_to_array(s, '.');42return v[1]::bigint + (v[2]::bigint::bit(64)<<24)::bigint + (from_base26(v[3])::bit(64)<<36)::bigint + (from_base26(v[4])::bit(64)<<52)::bigint;43END;44$$ LANGUAGE plpgsql;4546//we could have only one function, but then we would pay heavily for the if statement47CREATE OR REPLACE FUNCTION from_newspace_label_to_hecke_orbit_code(IN s varchar) RETURNS bigint AS $$48DECLARE49v text[];50BEGIN51v := string_to_array(s, '.');52return v[1]::bigint + (v[2]::bigint::bit(64)<<24)::bigint + (from_base26(v[3])::bit(64)<<36)::bigint;53END;54$$ LANGUAGE plpgsql;555657CREATE OR REPLACE FUNCTION prod_factorization(IN fact ANYARRAY, IN dummy ANYELEMENT = NULL) RETURNS ANYELEMENT AS $$58DECLARE59prod dummy%TYPE := 1;60BEGIN61IF array_length(fact, 1) != 0 THEN62FOR l in 1 .. array_length(fact, 1) LOOP63prod := prod * (fact[l][1]^fact[l][2]);64END LOOP;65END IF;66return prod;67END;68$$ LANGUAGE plpgsql;6970CREATE OR REPLACE FUNCTION prod(IN list ANYARRAY, IN dummy ANYELEMENT = NULL) RETURNS ANYELEMENT AS $$71DECLARE72prod dummy%TYPE := 1;73BEGIN74IF array_length(list, 1) != 0 THEN75prod := list[1];76FOR i in 2 .. array_length(list, 1) LOOP77prod := prod * list[i];78END LOOP;79END IF;80return prod;81END;82$$ LANGUAGE plpgsql;8384CREATE OR REPLACE FUNCTION prod2(IN list ANYARRAY, IN dummy ANYELEMENT = NULL) RETURNS ANYELEMENT AS $$85DECLARE86prod dummy%TYPE := 1;87BEGIN88IF array_length(list, 1) != 0 THEN89FOR i in 1 .. array_length(list, 1) LOOP90prod := prod * list[i][2];91END LOOP;92END IF;93return prod;94END;95$$ LANGUAGE plpgsql;969798CREATE OR REPLACE FUNCTION check_cc_prod(IN am double precision[], IN an double precision[], IN amn double precision[]) RETURNS bool AS $$99BEGIN100return @((am[1][1]*an[1][1] - am[1][2]*an[1][2]) - amn[1][1]) < 1e-13 AND @((am[1][1]*an[1][2] + am[1][2]*an[1][1]) - amn[1][2]) < 1e-13;101END;102$$ LANGUAGE plpgsql;103104CREATE OR REPLACE FUNCTION traces(IN ans double precision[]) returns double precision[] AS $$105DECLARE106res double precision[];107x double precision[];108BEGIN109res := array_fill(0, ARRAY[array_length(ans, 2)]);110FOREACH x SLICE 2 IN ARRAY ans LOOP111FOR i in 1 .. array_length(x, 1) LOOP112res[i] := res[i] + x[i][1];113END LOOP;114END LOOP;115return res;116END;117$$ LANGUAGE plpgsql;118119120121CREATE OR REPLACE FUNCTION compare_traces(IN an_int anyarray, IN an_cc double precision[], IN normalization double precision) returns bool AS $$122BEGIN123FOR i in 1 .. array_length(an_int, 1) LOOP124IF @((an_int[i] * (i^normalization)::numeric)::double precision - an_cc[i]) > 1e-11 THEN125raise notice 'i: %', i;126raise notice 'i^normalization: %', i^normalization;127raise notice 'normalization: %', normalization;128raise notice 'an_int[i] : %', (an_int[i] * (i^normalization)::numeric;129raise notice 'a_cc[i] : %', an_cc[i];130raise notice 'diff : %', @((an_int[i] * (i^normalization)::numeric)::double precision - an_cc[i]);131return false;132END IF;133END LOOP;134return true;135END;136$$ LANGUAGE plpgsql;137138139140CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)141RETURNS SETOF ANYARRAY AS142$func$143BEGIN144FOREACH a SLICE 1 IN ARRAY $1 LOOP145RETURN NEXT;146END LOOP;147END148$func$ LANGUAGE plpgsql IMMUTABLE;149150CREATE OR REPLACE FUNCTION unnest_2d_1d_2(IN m ANYARRAY, OUT a ANYARRAY)151RETURNS SETOF ANYARRAY AS152$func$153BEGIN154FOREACH a SLICE 2 IN ARRAY m LOOP155RETURN NEXT;156END LOOP;157END158$func$ LANGUAGE plpgsql IMMUTABLE;159160161CREATE OR REPLACE FUNCTION array_max(anyarray)162RETURNS anyelement LANGUAGE SQL IMMUTABLE AS $$163SELECT max(x) FROM unnest($1) as x;164$$;165166CREATE OR REPLACE FUNCTION array_min(anyarray)167RETURNS anyelement LANGUAGE SQL IMMUTABLE AS $$168SELECT min(x) FROM unnest($1) as x;169$$;170171CREATE OR REPLACE FUNCTION jsonb_arr2numeric_arr(_js jsonb) RETURNS numeric[] LANGUAGE SQL IMMUTABLE AS172'SELECT ARRAY(SELECT jsonb_array_elements_text(_js))::numeric[]';173174175CREATE OR REPLACE FUNCTION join6dot(IN a text[]) RETURNS text LANGUAGE SQL IMMUTABLE AS $$176SELECT a[1] || '.' || a[2] || '.' || a[3] || '.' || a[4] || '.' || a[5] || '.' || a[6];177$$;178179180