Project Euler 152(unsolved)

by uwi
@see http://projecteuler.net/index.php?section=problems&id=
♥0 | Line 67 | Modified 2009-12-08 23:37:19 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zxjY
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=
    public class Euler extends Sprite {
        private var _tf : TextField;
  
        public function Euler() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            tr(solve());
            var g : int = getTimer();
            tr((g - s) + " ms");
        }

        private function solve() : Number
        {
//            var a : Array = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
            var a : Array = [3];
            var i : int, j : uint, k : int, l : int;
            
            var ct : int = 0;
            for(i = 0;i < a.length;i++){
                var p : int = a[i];
//                var len : int = Math.min(p, 80 / p);
                var len : int = 80 / p;
                var mask : uint = 0;
                for(j = p - 1;j < len;j += p){
                    mask |= 1 << j;
                }
                for(j = 1;j < 1 << len;j++){
                    if(j & mask)continue;
                    var f : Array = [0, 1];
//                    var aa : Array = [];
                    for(k = j, l = 1;k > 0;k >>>= 1, l++){
                        if(k & 1){
                            f = addFrac(f, [1, l * l]);
//                            aa.push(l);
                        }
                    }
                    if(f[0] % (p * p) == 0 && (f[0] / (p * p)) % p != 0){
                        ct++;
//                        tr(p, f, aa);
                    }
                }
            }
            tr(ct);
            return 0;
        }
        
        private function addFrac(a : Array, b : Array) : Array
        {
            var d : Number = a[1] * b[1]; // / GCD(a[1], b[1]);
//            var u : int = a[0] * (d / a[1]) + b[0] * (d / b[1]);
            var u : Number = a[0] * b[1] + b[0] * a[1];
            var g : Number = GCD(u, d);
            return [u/g, d/g];
        }
        
        private function GCD(a : Number, b : Number) : Number
        {
            while(b > 0){
                var c : Number = a % b;
                a = b;
                b = c;
            }
            return a;
        }

        private function tr(...o : Array) : void
        {
            _tf.appendText(o + "\n");
            _tf.scrollV = _tf.maxScrollV;
        }
    }
}