#include <bits/stdc++.h>
using namespace std;
int g[1000005];
int mod = 1e9 + 7;
long long ltn(int a, int n, int m){
long long r=0;
for(;n>0;n>>=1,a=(a+a)%m)if(n&1)r=(r+a)%m; return r;
}
long long lltn(int a, int n, int m){
long long r=1;
a%=m;
for(;n>0;n>>=1,a=ltn(a,a,m))if(n&1)r=ltn(r,a,m);return r;
}
long long c(int n, int k){
return (ltn(g[n] , lltn(g[k], mod - 2, mod) ,mod) * lltn(g[n - k], mod - 2, mod) ) % mod;
}
int main() {
int x, y;
cin >> x >> y;
g[0] = 1;
for(int i = 1; i <= 1000000; i++){
g[i] = (g[i - 1] * i) % mod;
}
if(y % x != 0) cout << 0;
else{
int k = y / x;
vector<int> a;
int i = 2;
while(i * i <= k){
if(k % i == 0){
a.push_back(i);
while(k % i == 0) k /= i;
}
i++;
}
if(k > 1) a.push_back(k);
k = y/x;
long long res = 0;
res = lltn(2, k - 1, mod);
int n = a.size();
for (int i = 1; i < (1 << n); i++) {
long long p = 1, cnt = 0;
for (int j = 0; j < n; j++) {
if (i & (1 << j)) {
cnt++;
if(k / a[j] >= p){
p *= a[j];
}else{
p = 0;
break;
}
}
}
if(!p) continue;
if(cnt % 2 == 0) res = (res + lltn(2, k/p - 1, mod)) % mod;
else res = (res + mod - lltn(2, k/p - 1, mod)) % mod;
}
cout << lltn(2, k - 1, mod) << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBnWzEwMDAwMDVdOwppbnQgbW9kID0gMWU5ICsgNzsKbG9uZyBsb25nIGx0bihpbnQgYSwgaW50IG4sIGludCBtKXsKICAgIGxvbmcgbG9uZyByPTA7CiAgICBmb3IoO24+MDtuPj49MSxhPShhK2EpJW0paWYobiYxKXI9KHIrYSklbTsgcmV0dXJuIHI7Cn0KbG9uZyBsb25nIGxsdG4oaW50IGEsIGludCBuLCBpbnQgbSl7CiAgICBsb25nIGxvbmcgcj0xOwogICAgYSU9bTsKICAgIGZvcig7bj4wO24+Pj0xLGE9bHRuKGEsYSxtKSlpZihuJjEpcj1sdG4ocixhLG0pO3JldHVybiByOwp9CiAKbG9uZyBsb25nIGMoaW50IG4sIGludCBrKXsKCXJldHVybiAobHRuKGdbbl0gLCBsbHRuKGdba10sIG1vZCAtIDIsIG1vZCkgLG1vZCkgKiBsbHRuKGdbbiAtIGtdLCBtb2QgLSAyLCBtb2QpICkgJSBtb2Q7Cn0KIAppbnQgbWFpbigpIHsKCWludCB4LCB5OwoJY2luID4+IHggPj4geTsKCWdbMF0gPSAxOwoJCglmb3IoaW50IGkgPSAxOyBpIDw9IDEwMDAwMDA7IGkrKyl7CgkJZ1tpXSA9IChnW2kgLSAxXSAqIGkpICUgbW9kOwoJfQoJaWYoeSAlIHggIT0gMCkgY291dCA8PCAwOwoJZWxzZXsKCQlpbnQgayA9IHkgLyB4OwoJCXZlY3RvcjxpbnQ+IGE7CgkJaW50IGkgPSAyOwoJCXdoaWxlKGkgKiBpIDw9IGspewoJCQlpZihrICUgaSA9PSAwKXsKCQkJCWEucHVzaF9iYWNrKGkpOwoJCQkJd2hpbGUoayAlIGkgPT0gMCkgayAvPSBpOwoJCQl9CgkJCWkrKzsKCQl9CgkJaWYoayA+IDEpIGEucHVzaF9iYWNrKGspOwoJCQoJCWsgPSB5L3g7CgkJbG9uZyBsb25nIHJlcyA9IDA7CgkJcmVzID0gbGx0bigyLCBrIC0gMSwgbW9kKTsKCQkKCQlpbnQgbiA9IGEuc2l6ZSgpOwoJCWZvciAoaW50IGkgPSAxOyBpIDwgKDEgPDwgbik7IGkrKykgewoJCQlsb25nIGxvbmcgcCA9IDEsIGNudCA9IDA7CgkJCWZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CgkJCQlpZiAoaSAmICgxIDw8IGopKSB7IAoJCQkJCWNudCsrOwoJCQkJCWlmKGsgLyBhW2pdID49IHApewoJCQkJCQlwICo9IGFbal07CgkJCQkJfWVsc2V7CgkJCQkJCXAgPSAwOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoIXApIGNvbnRpbnVlOwoJCQlpZihjbnQgJSAyID09IDApIHJlcyA9IChyZXMgKyBsbHRuKDIsIGsvcCAtIDEsIG1vZCkpICUgbW9kOwoJCQllbHNlIHJlcyA9IChyZXMgKyBtb2QgLSBsbHRuKDIsIGsvcCAtIDEsIG1vZCkpICUgbW9kOwoJCX0KCQljb3V0IDw8IGxsdG4oMiwgayAtIDEsIG1vZCkgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9