public AnsCodingTable(FrequencyDictionary <int> observedFrequencies, int denominator = -1, byte[] encryptionKey = null)
        {
            if (denominator <= 0)
            {
                denominator = DEFAULT_DENOMINATOR;
            }

            Denominator         = (int)observedFrequencies.TotalFrequency;
            FrequencyDictionary = new Dictionary <int, Fraction>();
            foreach (FrequencyStorage <int> feature in observedFrequencies.GetSortedFrequencies())
            {
                FrequencyDictionary[feature.ContainedObject] = new Fraction(feature.Frequency, Denominator);
            }
            List <Fraction> toSimplify = new List <Fraction>();

            foreach (KeyValuePair <int, Fraction> pair in FrequencyDictionary)
            {
                toSimplify.Add(pair.Value);
            }
            toSimplify.Sort(Fraction.SORTER);
            int sharedDenominator = denominator;

            try
            {
                Fraction.ScaleFractionsToDenominator(toSimplify, sharedDenominator);
            } catch (ArgumentOutOfRangeException e)
            {
                throw new ArgumentException("Denominator insufficient to construct table without losing frequency fidelity. Either reduce the block size, or increase the denominator", e);
            }
            Streamer    = new CodingTableStreamer(FrequencyDictionary);
            Denominator = toSimplify[0].Denominator;
            GenerateTable(encryptionKey);
        }