├── README.md ├── convert.js └── manifest.json /README.md: -------------------------------------------------------------------------------- 1 | # RationalModConverter 2 | 3 | ## これはなに 4 | 5 | AtCoderのModをとる問題の問題文の中で,だいたいsqrt(Mod)より大きい値があったら,分母も分子も絶対値がだいたいsqrt(Mod)以下になる有理数に変換し,横に表示してくれるChrom拡張です. 6 | 7 | ## 細かい仕様 8 | 9 | 問題文のinnerHTML内に99844353, 1000000007, 10^{9}+7などが現れたら「Modを取る問題」と判定します. 10 | 2x^2 > Modとなる整数xを見つけた場合,https://en.wikipedia.org/wiki/Rational_reconstruction_(mathematics) のアルゴリズムに従って構築した有理数を赤字で横に表示します. 11 | 12 | ## 使い方 13 | 14 | このリポジトリをクローンして,Chromeに拡張機能として登録してください. 15 | chrome://extensions/ の「パッケージ化されていない拡張機能を読み込む」を押して,クローンしてできたディレクトリを指定すればOKです. 16 | 17 | ## その他 18 | 19 | PR大歓迎です.Issue建ててくれたら見ます. 20 | 21 | 何かあったらご連絡ください: [@catupper](https://twitter.com/catupper) -------------------------------------------------------------------------------- /convert.js: -------------------------------------------------------------------------------- 1 | const reconstruct = function(n, mod){ 2 | var v = [mod, 0]; 3 | var w = [n, 1]; 4 | while(w[0]*w[0]*2 > mod){ 5 | q = Math.floor(v[0] / w[0]); 6 | z = [v[0] - q*w[0], v[1] - q*w[1]]; 7 | v = w; 8 | w = z; 9 | console.log(JSON.stringify(w)); 10 | } 11 | if(w[1] < 0){ 12 | w[0] *= -1; 13 | w[1] *= -1; 14 | } 15 | return w; 16 | } 17 | 18 | const add_rational_expression = function(original, mod){ 19 | original += '*'; 20 | var buffer = ""; 21 | var res = ""; 22 | var tagParsing = false; 23 | for(var i = 0;i < original.length;i++){ 24 | var c = original[i]; 25 | if('<' == c) { 26 | tagParsing = true; 27 | res += buffer; 28 | buffer = ""; 29 | } 30 | else if('>' == c) { 31 | tagParsing = false; 32 | } 33 | if(!tagParsing) { 34 | if('0' <= c && c <= '9'){ 35 | buffer += c; 36 | } 37 | else{ 38 | if(buffer != ""){ 39 | var num = parseInt(buffer); 40 | if(num < mod && num * num * 2 > mod){ 41 | w = reconstruct(num, mod); 42 | buffer += ' ' + w[0] + "/" + w[1] + " "; 43 | } 44 | res += buffer; 45 | buffer = ""; 46 | } 47 | res += c; 48 | } 49 | }else { 50 | res += c; 51 | } 52 | } 53 | return res.slice(0, -1); 54 | } 55 | 56 | window.onload = function() { 57 | var mod = -1; 58 | var statement = document.getElementById("task-statement"); 59 | var src = statement.innerHTML; 60 | if(src.indexOf("998244353") != -1 || src.indexOf("998,244,353") != -1){ 61 | mod = 998244353; 62 | } 63 | if(src.indexOf("1000000007") != -1 || src.indexOf("10^{9}+7") != -1 || src.indexOf("1,000,000,007") != -1){ 64 | mod = 1000000007; 65 | } 66 | if(mod != -1){ 67 | statement.innerHTML = add_rational_expression(src, mod); 68 | } 69 | }; 70 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Rational Modulo Converter", 4 | "short_name": "RATMOD", 5 | "version": "0.0.1", 6 | "description": "reconstruct rational number from modulo", 7 | "content_scripts": [ 8 | { 9 | "matches": ["https://atcoder.jp/*"], 10 | "js": ["convert.js"] 11 | } 12 | ] 13 | } 14 | --------------------------------------------------------------------------------